假设我有一张这样的桌子:
表名:测试
col1 | col2 | col3 | col4
--------------------------
a | 0 | 0 | 1
是否可以检索行,以及不为零的列,而不必单独列出每一列?
有没有一种简单的方法来选择值为 1 的行?每行只有 1 列的整数值为 1。
我正在尝试获取不为零的这一行的列名。该表中的列会增长,所以我不想在我的 sql 语句中列出每个列名。我正在使用 SQLite。
关系数据库的目的是在行中进行操作,而不是在列中。所以列操作非常低效。也许你对你的问题使用了错误的方法。考虑一下:假设您找到了解决问题的方法,如果存在多个“1”会发生什么?如果没有“1”怎么办?
那么我想你也想要具有“1”值的列名,那么你在哪里设法将它存储在结果中?
我强烈建议您将该信息存储在另一个表中,这样您就可以快速实现您想要的。
类似的东西能达到你想要的吗?
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
一种方法是遍历每一列并确定每一行的该列中的值是否为一个。以下是您可以针对您的环境进行修改的示例:
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.
这是大量的手动工作,并且需要在您更改列时进行更新,但对您来说可能更简单。