2015-02-24 34 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