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

dst*_*grs 6 oracle null space concatenation

我需要将几个列连接成一个,每个值之间有空格.问题是当一个值为null时,我最终得到两个值之间的双倍空格.

SELECT (FIRST_NAME || ' ' || MIDDLE_NAME || ' ' || LAST_NAME
  FROM TABLE_A;
Run Code Online (Sandbox Code Playgroud)

如果中间名恰好是NULL,那么我最后在名字和姓氏之间有两个空格.有什么方法可以解决这个问题,只有空值时只有一个空格?

Red*_*ter 9

SELECT TRIM(TRIM(FIRST_NAME || ' ' || MIDDLE_NAME) || ' ' || LAST_NAME)   
FROM TABLE_A; 
Run Code Online (Sandbox Code Playgroud)

  • 这个是最正确的,因为接受的方法并不认为前两个参数可能是NULL. (4认同)

omn*_*nom 5

从Oracle的文档中:

CONCAT_WS(分离器,STR1,STR2,...)

CONCAT_WS()代表Concatenate With Separator,是CONCAT()的一种特殊形式.第一个参数是其余参数的分隔符.在要连接的字符串之间添加分隔符.分隔符可以是字符串,其余参数也可以.如果分隔符为NULL,则结果为NULL.

而非常重要的评论:

CONCAT_WS()不会跳过空字符串.但是,它会在分隔符参数后跳过任何NULL值.

所以在你的情况下它应该是:

CONCAT_WS(',', FIRST_NAME, MIDDLE_NAME, LAST_NAME);
Run Code Online (Sandbox Code Playgroud)

  • 如果我错了,请纠正我,但是在IDE中可以使用`CONCAT_WS()`,而不是Oracle RDBMS. (5认同)

Gri*_*aub 0

另一种选择是使用解码:

SELECT decode(FIRST_NAME,'','',FIRST_NAME ||' ') ||
       decode(MIDDLE_NAME,'','',MIDDLE_NAME ||' ') || LAST_NAME
FROM TABLE_A;
Run Code Online (Sandbox Code Playgroud)