说我有这样的一个表:SQL获得列在一排不为零
表名:测试
col1 | col2 | col3 | col4
--------------------------
a | 0 | 0 | 1
是否可以检索该行,只是在列不是零,不必单独列出每列。
是否有简单的方法来选择值为1的行?每行只有1列的整数值为1。
我想获得这一行不是零的列名称。这个表中的列会增长,所以我不想在我的sql语句中列出每个列名。我使用SQLite。
说我有这样的一个表:SQL获得列在一排不为零
表名:测试
col1 | col2 | col3 | col4
--------------------------
a | 0 | 0 | 1
是否可以检索该行,只是在列不是零,不必单独列出每列。
是否有简单的方法来选择值为1的行?每行只有1列的整数值为1。
我想获得这一行不是零的列名称。这个表中的列会增长,所以我不想在我的sql语句中列出每个列名。我使用SQLite。
关系数据库的目的是在行中进行操作,而不是在列中操作,所以列操作效率非常低。也许你对问题采用了错误的方法。考虑一下:假设你找到了解决问题的方法,如果存在多个“1”,会发生什么?如果不存在“1”会怎么样?
那么我想你也想要具有“1”值的列名,那么你在哪里设法将其存储在结果中?
我强烈建议您将该信息存储在另一个表中,以便快速实现您想要的功能。
我同意@kappa,似乎是一件很奇怪的事情。也许你需要一个有2列的表格 - 名称和值或什么的,只需选择那些值> 0. – Simon 2012-04-12 15:07:01
是的,我明白你的意思,这是一个伟大的想法 – 2012-04-12 15:08:43
是否有类似实现你正在寻找的东西?
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.
这是一个很大的手工操作,这将需要更新您更改列,但它可能对你更简单。
可能做的工作..但你确定这是值得做的事吗? – kappa 2012-04-12 15:08:58
@kappa - 好吧,这是丑陋的,它不会赢得任何速度奖项,但这真的取决于需要它的人。一切都取决于具体情况。我不会为这个计划设计一个数据库,但是如果我必须使用现有的系统并且需要这个报告,我肯定会考虑它。 – IAmTimCorey 2012-04-12 18:26:46
不一定高效,但您可以为架构中的每个字段执行查询。 – wachpwnski 2012-04-12 14:50:45
是的,我知道你的意思,但我会添加更多列到这张桌子,所以我试图避免这一点。 – 2012-04-12 14:51:41
哪个SQL ...你有MySQL和SQLite,更不用说SQL(SQL-server,Oracle等等) – DRapp 2012-04-12 14:52:34