我有一个包含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
请有人帮忙或任何想法,谢谢
答案 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获取所需结果的信息。