2012-11-13 101 views
1

在我的表中,我需要搜索特定行中的特定列以查找哪個列包含我定義的值。在特定的mySQL行中找到具有匹配值的列

例如在我的表

ID | Col1 | Col2 | Col3 | Col4 | Col5 | Col6 
-------------------------------------------- 
1 | A | B | C | C | B | A 
2 | C | B | A | A | C | B 
3 | B | A | C | B | A | C 

我需要一個查詢來搜索列4,5和6中行2並告訴我在其中發生列值B(COL6)。

回答

3

使用一系列CASE條件匹配'B'針對每列將做的工作。每個必須提供該列的字符串文字名稱作爲它的THEN值。您不能動態確定列名 - 它們必須是硬編碼的。

SELECT 
    CASE 
    WHEN Col2 = 'B' THEN 'Col2' 
    WHEN Col4 = 'B' THEN 'Col4' 
    WHEN Col6 = 'B' THEN 'Col6' 
    ELSE 'Not found' 
    END AS which_column 
FROM 
    yourtable 
WHERE id = 2 

要返回多於一個,你可以用在CONCAT()返回無論是列名或空字符串CASE語句。這意味着儘管使用幾個單獨的CASE語句,而不是針對同一個案例的多個條件。

SELECT 
    CONCAT(
    CASE WHEN col2 = 'B' THEN 'Col2 ' ELSE '' END, 
    CASE WHEN col4 = 'B' THEN 'Col4 ' ELSE '' END, 
    CASE WHEN col6 = 'B' THEN 'Col6' ELSE '' END 
) AS which_columns 
FROM yourtable 
WHERE id = 2 
+0

見參考:[CASE操作](http://dev.mysql.com/doc/refman/5.6/en/control-flow-functions.html#operator_case) – WarrenT

+0

這是很大的,感謝。你有任何建議如何調整它返回多個列名稱,如果該值出現不止一次? – ajcw

+0

@JohnCatterfeld是的,見上文。 –

0

你想要列的名稱?

您可以使用嵌套if例如

select if(Col4 = 'B', 'Col4', if(Col5 = 'B', 'Col5', if(Col6 = 'B', 'Col6', NULL))) 
from table where ID = 2 
相關問題