0

假设我有一张这样的桌子:

表名:测试

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

是否可以检索行,以及不为零的列,而不必单独列出每一列?

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

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

4

3 回答 3

1

关系数据库的目的是在行中进行操作,而不是在列中。所以列操作非常低效。也许你对你的问题使用了错误的方法。考虑一下:假设您找到了解决问题的方法,如果存在多个“1”会发生什么?如果没有“1”怎么办?

那么我想你也想要具有“1”值的列名,那么你在哪里设法将它存储在结果中?

我强烈建议您将该信息存储在另一个表中,这样您就可以快速实现您想要的。

于 2012-04-12T15:02:34.463 回答
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
于 2012-04-12T14:58:33.983 回答
0

一种方法是遍历每一列并确定每一行的该列中的值是否为一个。以下是您可以针对您的环境进行修改的示例:

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.

这是大量的手动工作,并且需要在您更改列时进行更新,但对您来说可能更简单。

于 2012-04-12T15:05:02.403 回答