【问题标题】:SQLite SELECT statement for column name where column has a value列有值的列名的 SQLite SELECT 语句
【发布时间】:2015-05-05 20:57:15
【问题描述】:

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

COLUMN NAME:   ALPHA BRAVO CHARLIE DELTA ECHO

ROW VALUE:        0    1      0      1     1

我只想要:Bravo、Delta、Echo。

【问题讨论】:

    标签: mysql sqlite fmdb


    【解决方案1】:

    您的请求并不完全清楚,但您似乎要求的是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
    

    [另外,请注意所有您的示例中的列都有值,一些 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 命令。

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 2014-03-07
        • 1970-01-01
        • 2014-01-18
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多