2016-08-01 46 views
0

我需要創建一個csv文件,其中包含一個字段,其中應根據每個條目的條件列出不同的元素。如何使用條件連接條件條目到一個字符串使用SQL

在例子中,我有這個表

id col1 col2 col3 
1  false false true 
2  true true true 
3  true false true 

的CSV應該是這樣的:

id,params 
"1","col3" 
"2","col1,col2,col3" 
"3","col1,col3" 

我認爲是這樣的:

SELECT 
    id, 
    CONCAT(
     IF(`col1`, 'col1,',''), 
     IF(`col2`, 'col2,',''), 
     IF(`col3`, 'col3','') 
    ) AS `params` 
FROM `table` 

但問題是,這隻有在最後一列(col3)爲真時纔有效,否則將有trailin g逗號結尾。

這在MySQL SQL方言中可能嗎?

回答

1

使用null而不是IF條件中的空字符串,並使用CONCAT_WS來連接值。

SELECT id, concat_ws(',',c1,c2,c3) params 
FROM (SELECT 
     id, 
     IF(`col1`, 'col1',null) c1, 
     IF(`col2`, 'col2',null) c2, 
     IF(`col3`, 'col3',null) c3 
     FROM t) x 

或者

SELECT id, 
concat_ws(',',if(col1,'col1',null),if(col2,'col2',null),if(col3,'col3',null)) params 
FROM t 
+0

第二個爲我做了這份工作,謝謝! – Thomas

1

爲什麼不只是增加更多的if報表與您當前的做法:

select id, 
    concat(if(col1, 'col1', ''), 
     if(col2, concat(if(col1,',',''), 'col2'), ''), 
     if(col3, concat(if(col1 or col2,',',''), 'col3'), '')) as newcol 
from yourtable 
+0

感謝您的回答。這基本上是我以前做過的,當你有三列時,這是可行的,但如果超越了這一點,則不可行。 – Thomas

1

你也許能夠只使用MySQL的雙參數字符串函數,伴隨着輕微的修改,您的原始級聯:

SUBSTRING(
CONCAT(
     IF(`col1`, ',col1',''), 
     IF(`col2`, ',col2',''), 
     IF(`col3`, ',col3','') 
    ) AS `params` 
, 2) 
1

只需從輸出中刪除任何開頭和結尾的逗號「」。

For More Info:MySQL TRIM() Function

select id,trim(both ',' from CONCAT(
     IF(`col1`, 'col1,',''), 
     IF(`col2`, 'col2,',''), 
     IF(`col3`, 'col3','') 
    )) as params from q; 

供參考:另一個替代選擇查詢中使用的情況下和修剪。

select id, 
TRIM(BOTH ',' from concat(case when col1 is not null and col1 = true then 'col1' else '' end , 
case when col2 is not null and col2 = true then ',col2' else '' end , 
case when col3 is not null and col3 = true then ',col3' else '' end)) as params 
from q; 
+1

我喜歡裝飾解決方案。 – Thomas