连接字符串并合并

concatenate strings and coalesce

我有一个从三个不同的 table 中选择行的查询: TableATableBTableC

我查询的一个字段必须是每个 table 中的字段 Name 的串联,如以下别名:

SELECT
    A.Name,
    B.Name,
    C.Name,
    CONCAT(A.Name, ' / ', B.Name, ' / ', C.Name) AS Full_name
FROM ... 

查询使用 LEFT OUTER JOIN 连接三个 table。在某些情况下,如果 table 之一没有以下条目,我会得到奇怪的结果 table:

--------------------------
|Table A |Table B|Table C|
--------------------------
|My      |Name   |       |
--------------------------
|My      |       |Is     |
--------------------------
|My      |Name   |Is     |
--------------------------

尾随 / 像这样可见:

1) My / Name /
2) My / / Is
3) My / Name / Is

我应该生成以下结果,但我不想使用 CASE,所以我想知道我是否可以同时使用 COALESCE、ISNULL 和 CONCAT

预期结果

1) My / Name
2) My / Is
3) My / Name / Is

添加“/”和名称时,如果名称为空,则返回空值。因此,您只需添加即可删除它们。

试试这个:

SELECT
    A.Name,
    B.Name,
    C.Name,
    CONCAT(A.Name, ' / '+ B.Name, ' / '+ C.Name) AS Full_name
FROM 
...

样本在 Fiddle.

另一种方法:

SELECT
    A.Name as AName,
    B.Name as BName,
    C.Name as CName,
    CONCAT(A.Name, 
           CASE WHEN B.Name IS NOT NULL THEN ' / ' END, 
           B.Name, CASE WHEN C.Name IS NOT NULL THEN ' / ' END,  
           C.Name) AS Full_name
FROM 
......

结果:

ANAME   BNAME   CNAME   FULL_NAME
My      Name    (null)  My / Name
My      (null)  Is      My / Is
My      Name    Is      My / Name / Is

SQL Fiddle 中的示例输出。

我会采用的方法是:

STUFF(CONCAT(' / ' + A.Name, ' / ' + B.Name, ' / ' + C.Name), 1, 3, '')

前提是,如果您的任何值是 NULL,那么 ' / ' + NULL 也将为空,但是通过将 ' / ' 附加到所有内容的开头,您就知道您将永远以 / 开头,因此您可以使用 STUFF 函数安全地删除前 3 个字符。

一个稍微扩展的例子是

SELECT  *,
        [Concat] = STUFF(CONCAT(' / ' + A, ' / ' + B, ' / ' + C, ' / ' + D), 1, 3, '')
FROM    (VALUES
            ('A', 'B', NULL, 'D'),
            ('A', NULL, 'C', NULL),
            ('A', 'B', 'C', NULL),
            ('A', 'B', 'C', 'D'),
            ('A', NULL, NULL, 'D'),
            (NULL, NULL, NULL, NULL),
            (NULL, 'B', 'C', NULL)
        ) T (A, B, C, D);