如何为Where子句中的所有列提取一个指定条件?

时间:2018-02-14 19:20:28

标签: mysql sql

我有一个包含200列的表,我想选择所有列 '完成'或者'不完整'值。这张表有180列,可以完成'或者'不完整'值和其他列是日期,签名,ID等。

所以第一个想法是写一个长的查询,比如

SELECT column2,column4,column5,...,column199 FROM table WHERE column2 like  'completed' or column2 like 'incomplete' or column4 like....

但是这个查询太简单太长了。 有没有办法写下面的东西?

select 
[Columns that have values like 'completed' or 'incomplete'( if the value is not them do not select them)]
from Table 

请有人帮忙或任何想法,谢谢

2 个答案:

答案 0 :(得分:0)

对于这种特殊情况,你可以这样做:

select 
    datediff(minute, t1, t2) -
    (select 
         case
            when cast(t1 as time) > '14:30:00:000' and cast(t2 as time) < '14:45:00:000'  
               then 15 
               else 0 
         end as breaks)

使用where greatest(col1, col2, col3) = 'completed' and least(col4, col5, col6) = 'incompleted' least()具体是因为有两个值并且基于值的排序。

我应该注意数据结构是可疑的。通过为每种状态提供180 ,您会得到更好的服务。

答案 1 :(得分:0)

此选择查询应该可以获取表格中的所有列。

SELECT column_name 
FROM   information_schema.columns 
WHERE  table_schema = 'your_db' 
       AND table_name = 'your_table' 
ORDER  BY ordinal_position 

从结果中,您可以创建一个字符串,以任何您想要的方式连接列名称。然后,您将得到一个将生成的字符串,并且将包含您需要的所有列,并且您不必单独键入所有列名称。然后,您可以使用EXECUTE命令执行该字符串。以下是它的外观示例。

SET @s = CONCAT('SELECT * FROM your_table WHERE greatest(', SELECT GROUP_CONCAT(column_name)
    FROM   information_schema.columns 
    WHERE  table_schema = 'your_db' 
           AND table_name = 'your_table'
    GROUP BY table_name
    ORDER  BY ordinal_position, ') = ''completed''); 

EXECUTE @s

请记住,上面的示例不可执行。需要正确调整'以适应字符串文字等,但这应该能够为您提供有关如何使用动态SQL获取所需结果的信息。