2015-02-24 36 views
2

我有一个查询,从三个不同的表中选择行: TableA,TableBTableC。我查询的连接字符串和合并

1场是场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 

回答

7

添加'/'和名称时,如果name为null,则返回null。因此你可以简单地通过添加来删除它们。

试试这个:

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

Fiddle样品。

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

结果:SQL Fiddle

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

示例输出。

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

这比在情况矿井,其中第一值可以为空更好的解决方案 – 2015-03-01 22:14:47