连接字符串和合并

时间:2015-02-24 11:52:46

标签: sql-server tsql string-concatenation concat

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

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

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

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

--------------------------
|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

3 个答案:

答案 0 :(得分:7)

添加'/'和Name时,如果name为null,则为null。因此,您只需添加即可删除它们。

试试这个:

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

Fiddle中的示例。

答案 1 :(得分:2)

我想采取的方法是:

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);

答案 2 :(得分:0)

另一种方法:

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中的示例输出。