2012-04-12 50 views
0

说我有这样的一个表:SQL获得列在一排不为零

表名:测试

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

是否可以检索该行,只是在列不是零,不必单独列出每列。

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

我想获得这一行不是零的列名称。这个表中的列会增长,所以我不想在我的sql语句中列出每个列名。我使用SQLite。

+0

不一定高效,但您可以为架构中的每个字段执行查询。 – wachpwnski 2012-04-12 14:50:45

+0

是的,我知道你的意思,但我会添加更多列到这张桌子,所以我试图避免这一点。 – 2012-04-12 14:51:41

+0

哪个SQL ...你有MySQL和SQLite,更不用说SQL(SQL-server,Oracle等等) – DRapp 2012-04-12 14:52:34

回答

1

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

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

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

+0

我同意@kappa,似乎是一件很奇怪的事情。也许你需要一个有2列的表格 - 名称和值或什么的,只需选择那些值> 0. – Simon 2012-04-12 15:07:01

+0

是的,我明白你的意思,这是一个伟大的想法 – 2012-04-12 15:08:43

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 
+0

其实我正在寻找更像这样的东西:select(col2,col3,col4)其中col1 = value和col2!= 0和col3!= 0和col4!= 0;但我希望不必写下每个栏目名称就可以做到。我只想要在col2,col3,col4 – 2012-04-12 15:00:33

+0

中不是零的那一列,所以当你添加它们时你必须列出列。 – kappa 2012-04-12 15:02:58

+0

@kappa是的,但是如果需要你可以动态地创建那个sql。 – Simon 2012-04-12 15:04:20

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. 

这是一个很大的手工操作,这将需要更新您更改列,但它可能对你更简单。

+0

可能做的工作..但你确定这是值得做的事吗? – kappa 2012-04-12 15:08:58

+0

@kappa - 好吧,这是丑陋的,它不会赢得任何速度奖项,但这真的取决于需要它的人。一切都取决于具体情况。我不会为这个计划设计一个数据库,但是如果我必须使用现有的系统并且需要这个报告,我肯定会考虑它。 – IAmTimCorey 2012-04-12 18:26:46