2011-11-26 25 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のリストがないため、, ,を表示しないようにする必要があります。

私は自分自身でいくつかの調査を行い、ダブルコンマを置き換えるためにSUBSTRをOracleで使用することに決めましたが、少し汚れているようです。複雑な機能(例えばthis previous SO questionなど)の使用を避けて、これを行うよりクリーンな方法がありますか?

これは私が持っているものです。

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

おかげ

答えて

7

あなたはnullになる可能性の分野を中心にNVL2を使用することができます

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

で私は私の答えを削除し、あなたが言及したのと同じです。私はケースステートメントに切り替え始めましたが、あなたの答えを見ました - +1 –

+0

+1。 @ヤヒヤ - あなたは私に大きな頭痛を救った。ありがとう! –

2

を試してみてください、でNVL2(county, county || ',', '')

3

よう気にいらすべてのfiieldsがNULLの場合、あなたは愚かな '、'代わりにNULLが必要です。私は(私はそれがSQL Serverでないと考えているよう)のNULLを持つOracle列concatsにヌルが得られないことが分かっているため、余分なものを削除するには、このアプローチを試してみてください「」結果の開始

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

関連する問題