SQL Select; 连接字符串,避免列为空的双逗号?

Jim*_*mmy 6 sql oracle 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  
Run Code Online (Sandbox Code Playgroud)

我想要做的是显示一个人名列表,以及他们的地址连接成一个逗号分隔的字符串.

这部分很简单,我用了||连接列并放置逗号分隔符.

我正在质疑的部分是,有些行没有列出任何内容COUNTY,因此我需要避免显示, ,.

我已经为自己做了一些研究,并决定使用Oracle中的SUBSTR替换双逗号,但它确实感觉有点"脏".是否有更简洁的方法来避免使用复杂的功能(例如之前的SO问题)?

这就是我所拥有的:

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

谢谢

Yah*_*hia 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
Run Code Online (Sandbox Code Playgroud)

  • 我删除了我的答案,因为我发现在使用NULL的Oracle字符串concats中不会产生null(我相信它在SQL Server中会产生),就像你提到的那样.我开始切换到案例陈述,但后来看到了你的答案 - +1 (2认同)

ale*_*nin 5

在先前的答案中,如果所有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
Run Code Online (Sandbox Code Playgroud)