列的SQLite SELECT语句,其中列具有值

时间:2015-05-05 20:57:15

标签: mysql sqlite fmdb

我需要什么SQLite语句来获取列名称WHERE有值?

COLUMN NAME:   ALPHA BRAVO CHARLIE DELTA ECHO

ROW VALUE:        0    1      0      1     1

我想要的回报是:Bravo,Delta,Echo。

2 个答案:

答案 0 :(得分:2)

您的请求并不完全清楚,但您出现要求的SELECT语句不会返回数据,而是返回列名,而不是可预测的值数,而是取决于表中数据的数字值。

例如,

A B C D E
0 1 0 1 1

将返回(B,D,E)而

A B C D E
1 0 1 0 0

将返回(A,C)。

如果这就是您要问的问题,那么这不是SQL所做的事情。 SQL从表中检索数据,SQL结果集每行的列数始终相同。

要实现目标,您必须检索可能在表中具有值的所有列,然后在程序代码中检查每列中的值并生成列表具有值的列名。

另外,考虑当要检查多行并且值的分布不同时会发生什么。换句话说,如果数据如下所示,预期结果是什么:

A B C D E
- - - - -
0 1 0 1 1
1 0 1 0 0

[另请注意, all 示例中的列有值,有些0,有些1.您真正想要的是列名称列表,其中列包含值1.]

最后,请注意,您无法轻松从数据中获得所需的结果,这可能表明您正在使用的数据模型存在缺陷。例如,如果您要构建这样的数据:

 TagName   TagValue
 -------   --------
 Alpha      0
 Bravo      1
 Charlie    0
 Delta      1
 Echo       1

然后,您可以使用SELECT TagName FROM Tags WHERE TagValue = 1获取结果。

此外,如果0和1实际上是唯一两个可能的值(表示布尔值"存在"或"缺少"标记),那么您可以删除TagValue列和行完全为AlphaCharlie(您在表格中添加INSERT行以添加标记,并在行中DELETE删除它。

沿着这些线的设计似乎可以更准确地为您的数据建模,并允许您将全部新标签发送到系统,而无需发出ALTER TABLE命令。

答案 1 :(得分:-1)

http://sqlfiddle.com/#!9/1407e/1

SELECT CONCAT(IF(ALPHA,'ALPHA,',''),
             IF(BRAVO,'BRAVO,',''),
             IF(CHARLIE,'CHARLIE,',''),
             IF(DELTA,'DELTA,',''),
             IF(ECHO,'ECHO','')) 
FROM table1