连接多个列且一列为空时的空格-Oracle
我需要将多个列连接成一个列,每个值之间有空格。问题是当一个值为null时,两个值之间会出现一个双空格 范例连接多个列且一列为空时的空格-Oracle,oracle,null,concatenation,space,Oracle,Null,Concatenation,Space,我需要将多个列连接成一个列,每个值之间有空格。问题是当一个值为null时,两个值之间会出现一个双空格 范例 SELECT (FIRST_NAME || ' ' || MIDDLE_NAME || ' ' || LAST_NAME FROM TABLE_A; 如果中间名恰好为NULL,那么在名字和姓氏之间就有两个空格。有没有办法绕过这个问题,在有空值时只使用一个空格?您可以使用它来添加空格字符: SELECT TRIM(TRIM(FIRST_NAME || ' ' || MIDDLE_NAM
SELECT (FIRST_NAME || ' ' || MIDDLE_NAME || ' ' || LAST_NAME
FROM TABLE_A;
如果中间名恰好为NULL,那么在名字和姓氏之间就有两个空格。有没有办法绕过这个问题,在有空值时只使用一个空格?您可以使用它来添加空格字符:
SELECT TRIM(TRIM(FIRST_NAME || ' ' || MIDDLE_NAME) || ' ' || LAST_NAME)
FROM TABLE_A;
SELECT RPAD(first_name, LENGTH(first_name)+1, ' ')||RPAD(middle_name, LENGTH(middle_name)+1, ' ')||last_name
FROM TABLE_A;
当
RPAD
的任何参数为空时,结果将为空,在Oracle中,向字符串追加NULL将返回原始字符串。另一个选项是使用解码:
SELECT decode(FIRST_NAME,'','',FIRST_NAME ||' ') ||
decode(MIDDLE_NAME,'','',MIDDLE_NAME ||' ') || LAST_NAME
FROM TABLE_A;
还有一个选择:
SELECT first_name
|| DECODE(middle_name
, NULL, NULL
, ' ' || middle_name)
|| DECODE(last_name
, NULL, NULL
, ' ' || last_name) full_name
FROM table_a
;
或者您可以简单地使用REPLACE函数:
with indata as
(select 'John' as first_name, 'W' as middle_name, 'Smith ' as last_name from dual
union
select null as first_name, null as middle_name, 'Adams' as last_name from dual
union
select 'Tom' as first_name, null as middle_name, 'Jefferson' as last_name from dual)
SELECT REPLACE(TRIM(indata.first_name || ' ' || indata.middle_name || ' ' || indata.last_name), ' ', ' ')
FROM indata
(感谢@tbone提供示例数据:-)来自Oracle文档: 混凝土(分离器、str1、str2等) CONCAT_WS()代表带分隔符的连接,是一个特殊的 CONCAT()的形式。第一个参数是其余参数的分隔符 争论。分隔符添加在要删除的字符串之间 连接。分隔符可以是字符串,字符串的其余部分也可以是字符串 论据。如果分隔符为NULL,则结果为NULL 非常重要的一点是: CONCAT_WS()不会跳过空字符串。但是,它确实跳过了任何 分隔符参数后的值为NULL 因此,在您的情况下,应该是:
CONCAT_WS(',', FIRST_NAME, MIDDLE_NAME, LAST_NAME);
这就是我通常在Oracle中连接多个字段并删除空白的方式:
TRIM(REGEXP|u替换(房屋编号前缀街道名称街道类型后缀+)
我有这个例子。希望这有帮助。只需转到SQL server,选择新建查询,然后选择以下查询:
DECLARE @NULL_SAMLES TABLE
(
NS_ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL
,COL_01 VARCHAR(10) NULL
,COL_02 VARCHAR(10) NULL
,COL_03 VARCHAR(10) NULL
,COL_04 VARCHAR(10) NULL
)
INSERT INTO @NULL_SAMLES(COL_01,COL_02,COL_03,COL_04)
VALUES
('A','B','C','D')
,(' ' ,'B','C','D')
,(' ',NULL,'C','D')
,('A','B',NULL,'D')
,('A','B','C',NULL)
,(NULL,'B',NULL,'D')
,(NULL,'B','C',NULL)
,('A',NULL,'C',NULL)
,('A',NULL,NULL,'D')
,('A',NULL,NULL,NULL)
,(NULL,'B',NULL,NULL)
,(NULL,NULL,'C',NULL)
,(NULL,NULL,NULL,'D')
SELECT
NS.COL_01
,NS.COL_02
,NS.COL_03
,NS.COL_04,
Stuff(
Coalesce(', ' + nullif(NS.COL_01, ''), '')
+ Coalesce(', ' + nullif(NS.COL_02, ''), '')
+ Coalesce(', ' + nullif(NS.COL_03, ''), '')
+Coalesce(', ' + nullif(NS.COL_04, ''), '')
, 1, 1, '') AS CONC_COLS
FROM @NULL_SAMLES NS
不要低估CASE语句的简单功能,它可以连接在一起。下面是一个可以按原样运行的自包含示例:
SELECT
CASE WHEN x.FIRST_NAME IS NULL THEN x.FIRST_NAME ELSE x.FIRST_NAME || ' ' END ||
CASE WHEN x.MIDDLE_NAME IS NULL THEN x.MIDDLE_NAME ELSE x.MIDDLE_NAME || ' ' END ||
x.LAST_NAME
FROM (SELECT 'John' AS FIRST_NAME, NULL AS MIDDLE_NAME, 'Doe' AS LAST_NAME FROM DUAL) x;
如果中间名或姓氏是空字符串(即''')-它不能正常工作…在Oracle中它会;Oracle不区分空字符串和
NULL
.ha!即将发布regexp_替换方法!我最终使用了您之前发布的NVL()方法。我确实发现表中有一些值是空的(或者我认为是空的),但实际上有一个空格,所以这些行让我很困惑……我收回这些。我必须像上面那样合并解码。感谢您的帮助因为'
在Oracle中为空,这里的nvl
调用没有任何价值。“如果FIRST_NAME为null,则返回null,否则返回FIRST_NAME”与“return FIRST_NAME”相同。这是最正确的,因为公认的方法不假设前两个参数可以为null。如果我错了,请纠正我,但是MySQL中提供了CONCAT_WS()
,而不是Oracle RDBMS。
SELECT
CASE WHEN x.FIRST_NAME IS NULL THEN x.FIRST_NAME ELSE x.FIRST_NAME || ' ' END ||
CASE WHEN x.MIDDLE_NAME IS NULL THEN x.MIDDLE_NAME ELSE x.MIDDLE_NAME || ' ' END ||
x.LAST_NAME
FROM (SELECT 'John' AS FIRST_NAME, NULL AS MIDDLE_NAME, 'Doe' AS LAST_NAME FROM DUAL) x;