2012-02-29 111 views
6

昨天我問了一個問題,關於如何將多個結果放入一個字段並給出了答案GROUP_CONTACT()GROUP_CONCAT用分隔符拉出空結果

我已經把它放到我的代碼中,它工作正常。我需要爲兩個字段執行此操作,因此我現在已經開始在同一個sql語句中使用它兩次。不幸的是,它用逗號拉回了第二個字段的空白列表,我不太清楚爲什麼。

這裏是我的樣本產品數據:

pid || prod 
1 || top 
2 || sweater 

這裏是我的樣本股的數據(一些股票沒有兩種尺寸,例如腰部和胸部):

sid || size1 || size2 || pid 
1 || M  ||  || 1 
2 || L  ||  || 1 
3 || XL ||  || 1 
4 || L  ||  || 2 
5 || XL ||  || 2 

這裏是我的代碼:

SELECT p.id, GROUP_CONCAT(s.size1) size1, GROUP_CONCAT(s.size2) size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id 

這是應該帶什麼了:

pid || size1 || size2 || prod 
1 || M,L,XL ||  || top 
2 || L,XL ||  || sweater 

這是它實際上是帶出:

pid || size1 || size2 || prod 
1 || M,L,XL || ,, || top 
2 || L,XL || ,  || sweater 

我檢查,看看是否有在size2個空格或任何東西,沒有什麼在那裏。

我這樣做的查詢和產品回來如我所料:

SELECT size1, size2 FROM stock WHERE pid = 1 AND size2 = "" 

當我做這個查詢,再沒回來:

SELECT size1, size2 FROM stock WHERE pid = 1 AND size2 IS NULL 

我知道GROUP_CONCAT()會忽略空的結果,但我需要做些什麼來阻止GROUP_CONTACT()顯示一個空的逗號分隔列表,當它只是""而不是NULL

回答

16
SELECT p.id, GROUP_CONCAT(s.size1) size1, 
GROUP_CONCAT(if (s.size2 ='', null, s.size2)) as size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id 
2

試試這個:

SELECT 
    p.id, 
    GROUP_CONCAT(s.size1) size1, 
    GROUP_CONCAT(case when s.size2='' then null else s.size2 end) size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id 
0

您是否嘗試過使用GROUP_CONCAT(DISTINCT column)?根據我對文檔的理解,它應該會像你想要的那樣產生一個空字符串。

DISTINCT將消除所有重複項,只有一次發生""

7

您還可以使用NULLIF()功能爲空字符串轉換爲空值:

SELECT 
    p.id, 
    GROUP_CONCAT(  s.size1 ) AS size1, 
    GROUP_CONCAT(NULLIF(s.size2, '')) AS size2, 
    p.prod 
FROM products AS p 
    INNER JOIN stock AS s ON s.prodid = p.id 
GROUP BY 
    p.id, 
    p.prod 
;