2011-11-26 146 views
5

我有以下参考数据。SQL Select;串联字符串,避免列为空的双逗号?

PERSON_NAME     STREET     TOWN    COUNTY   POSTCODE 
------------------------------ ------------------------ ---------------- ---------------- ---------- 
David Smith     30 Johnson Street  Norwich   Norfolk   NA38 3KL 
John Brown      Douglas Road    Cambridge       C8 9IJ  
Jackie White     8 High Street   Ipswich   Suffolk   IP7 2YT 
Andrea Blue     9 Marlborough Ave  Bury    Suffolk   IP4 0XC 
Jemima Green     Riverside Walk   Colchester  Essex   CO6 7PR 
James Gray      167 Hadleigh Place  London       SW1 4TU 

我想要做的,就是显示人的名单,连同他们的地址连接成一个逗号分隔字符串。

这部分很简单,我用||来连接列和放置逗号分隔符。

我有问题的部分是有些行没有列出COUNTY,因此我需要避免显示, ,

我已经为自己做了一些研究,并决定在Oracle中使用SUBSTR来代替双逗号,但它确实感觉有点“脏”。有没有更简单的方法来避免使用复杂的功能(例如this previous SO question)?

这是我有:

SELECT 
    SUPPNAME as "Supplier Name", 
    REPLACE(STREET || ', ' || TOWN || ', ' || COUNTY || ', ' || POSTCODE, ' ,','') as "Supplier Address" 
FROM 
    SUPPLIERS 
; 

感谢

回答

7

尝试

SELECT 
SUPPNAME AS "Supplier Name", 
(
CASE WHEN STREET IS NULL THEN '' ELSE STREET || ', ' END || 
CASE WHEN TOWN IS NULL THEN '' ELSE TOWN || ', ' END || 
CASE WHEN COUNTY IS NULL THEN '' ELSE COUNTY || ', ' END || 
CASE WHEN POSTCODE IS NULL THEN '' ELSE POSTCODE END 
) AS "Supplier Address" 
FROM SUPPLIERS 
+2

我删除了我的答案,因为我发现开始尝试这种方法来删除一个多余的“”在甲骨文串concats与空值不会产生空(因为我相信它在SQL服务器),就像你所说的那样。我开始转向病例陈述,但后来看到了您的答案 - +1 –

+0

+1。 @Yahia - 你刚刚为我节省了一大笔头痛。谢谢! –

2

你可以使用NVL2周围,可能是空的字段,财产以后像NVL2(county, county || ',', '')

3

在以前的答案,如果所有fiields是NULL,那么你将只会得到愚蠢的','而不是预期的NULL。在结果

SELECT 
SUPPNAME AS "Supplier Name", 
SUBSTR(
    NVL2(STREET, ', ' || STREET, NULL) 
     || NVL2(TOWN, ', ' || TOWN, NULL) 
     || NVL2(COUNTY, ', ' || COUNTY, NULL) 
     || NVL2(POSTCODE, ', ' || POSTCODE, NULL) 
    ,2) AS "Supplier Address" 
FROM SUPPLIERS 
+0

这对我来说非常合适,我避免了尾随逗号。 – user2710915