说我有这样一张桌子:
表名:测试
col1 | col2 | col3 | col4
--------------------------
a | 0 | 0 | 1
是否可以检索行,只检索非零的列,而不必单独列出每列?
有一种简单的方法可以选择值为1的行吗?每行只有1列的整数值为1。
我试图让这一行的列名不为零。这个表中的列会增长,所以我不想在我的sql语句中列出每个列名。我正在使用SQLite。
答案 0 :(得分:1)
关系数据库旨在以行而不是列进行操作。因此列操作效率非常低。也许你对你的问题采用了错误的方法。考虑一下:假设你找到了解决问题的方法,如果存在多个“1”会发生什么?如果没有“1”怎么办?
然后我想你也想要具有“1”值的列名,那么你在哪里设法将它存储在结果中?
我强烈建议您将该信息存储在另一个表中,这样您就可以快速实现您想要的目标。
答案 1 :(得分:0)
有什么能达到你想要的目的吗?
create table Test
(
col1 nvarchar(100),
col2 int,
col3 int,
col4 int
)
insert into Test values('a', 1, 0, 0)
insert into Test values('b', 0, 2, 0)
insert into Test values('c', 0, 0, 3)
select col1, val = case
when col2 > 0 then col2
when col3 > 0 then col3
when col4 > 0 then col4
end
from test
答案 2 :(得分:0)
执行此操作的一种方法是遍历每个列,并确定每列中该值是否为1。以下是您可以针对您的环境进行修改的示例:
http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm
您还需要调整它以使其与SQLite一起使用。这是我从一个那样做的人那里得到的一句话:
我最终通过几个循环来完成它,首先,从sqlite_master表中提取表名数组,然后再循环遍历每个列名,我从dbCursor.description中取出。 http://forums.fedoraforum.org/showthread.php?t=219441
这将是一个混乱的过程,但它可能会满足您的需求。如果你不想变得太复杂,你可以这样做:
SELECT 'Col1' AS Column
FROM Table
WHERE Col1 = 1
UNION ALL
SELECT 'Col2' AS Column
FROM Table
WHERE Col2 = 1
etc.
这是很多手动工作,需要在更改列时进行更新,但对您来说可能更简单。