2011-11-26 29 views
5

Tôi có dữ liệu tham chiếu sau đây.Chọn SQL; Ghép nối các chuỗi, tránh dấu phẩy kép trong đó các cột là null?

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 

Điều tôi muốn làm là hiển thị danh sách tên người, cùng với địa chỉ của chúng được nối vào chuỗi được phân cách bằng dấu phẩy.

Phần này rất dễ, tôi đã sử dụng || cho các cột đồng thời và đặt dấu phân cách bằng dấu phẩy.

Phần tôi đang đề cập đến, là một số hàng không có bất kỳ thứ gì được liệt kê cho COUNTY, do đó tôi cần tránh hiển thị , ,.

Tôi đã thực hiện một số nghiên cứu cho bản thân mình và đã quyết định sử dụng SUBSTR trong Oracle để thay thế dấu phẩy kép, tuy nhiên nó cảm thấy hơi "bẩn". Có cách nào làm sạch hơn, tránh sử dụng các chức năng phức tạp (chẳng hạn như this previous SO question)?

Đây là những gì tôi có:

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

Cảm ơn

Trả lời

7

thử

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

Tôi đã xóa câu trả lời của mình vì tôi thấy rằng trong chuỗi Oracle concats với NULL không mang lại giá trị rỗng (như tôi tin là SQL Server), giống như bạn đã đề cập. Tôi bắt đầu chuyển sang báo cáo trường hợp, nhưng sau đó nhìn thấy câu trả lời của bạn - +1 –

+0

+1. @ Yahia - Bạn vừa mới cứu tôi một cơn đau đầu rất lớn. Cảm ơn! –

2

Bạn có thể sử dụng NVL2 xung quanh lĩnh vực mà có thể là null, somthing như NVL2(county, county || ',', '')

3

Trong câu trả lời trước nếu tất cả các fiields là NULL thì bạn sẽ chỉ nhận được stupid ',' thay vào đó là NULL. Hãy thử phương pháp này để xóa thêm một ',' khi bắt đầu kết quả

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

Điều này làm việc hoàn hảo cho tôi và tôi tránh dấu phẩy. – user2710915

Các vấn đề liên quan