连接多个列且一列为空时的空格-Oracle

连接多个列且一列为空时的空格-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

我需要将多个列连接成一个列,每个值之间有空格。问题是当一个值为null时,两个值之间会出现一个双空格

范例

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;