SQL获取列不是零的行

时间:2012-04-12 14:47:32

标签: mysql sql sqlite

说我有这样一张桌子:

表名:测试

col1 | col2 | col3 | col4
--------------------------
a    | 0    | 0    | 1

是否可以检索行,只检索非零的列,而不必单独列出每列?

有一种简单的方法可以选择值为1的行吗?每行只有1列的整数值为1。

我试图让这一行的列名不为零。这个表中的列会增长,所以我不想在我的sql语句中列出每个列名。我正在使用SQLite。

3 个答案:

答案 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.

这是很多手动工作,需要在更改列时进行更新,但对您来说可能更简单。