我一直在环顾四周,试图找到一种方法来检索列名(数据类型是布尔值),只要它是“真”/“1”。
例如,我将此表与A,B,C,D,E,F作为不同的列名称和它下面的布尔值,
A | B | C | D | E | F
1 | 1 | 0 | 0 | 1 | 0
我想要检索的内容,即只有具有“true”值的列名。因此,我从查询中得到的结果应该只是A,B和E.
有没有办法做到这一点?或者完全不可能完成,我应该重新设计我的数据库?
提前致谢, Xyles
答案 0 :(得分:1)
查询不能包含不同数量的列。您可以将列的名称连接起来:
select concat_ws(',', (case when A then 'A' else '' end),
(case when B then 'B' else '' end),
...
)
from t
您还可以将它们放在单独的行中,并使用union
:
select t.*, 'A'
from t
where A
union all
select t.*, 'B'
from t
where B
. . .
这会将值放在不同的行上。
答案 1 :(得分:1)
我建议您重新考虑数据库设计。
可以完成返回列名,但它不是SQL编程的规范模式,并且查询将比他们需要的更多涉及。
如果您需要返回的是一个包含以逗号分隔的值列表的字符串,并且列表中的每个值都表示TRUE条件,我建议您考虑MySQL SET
数据类型。 e.g。
mycol SET('A','B','C','D','E','F') NOT NULL
http://dev.mysql.com/doc/refman/5.5/en/set.html
INSERT INTO mytable (mycol) VALUES ('A,B,E');
UPDATE mytable SET mycol = 'A,B,E' WHERE ...
SELECT mycol FROM mytable WHERE ...