2012-11-13 104 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 
相关问题