【问题标题】:How can I limit columns returned based on their value?如何根据值限制返回的列?
【发布时间】:2009-09-04 12:20:22
【问题描述】:

我有一张桌子,看起来像

index customer_number ABC CWD ROE BEE 
1                   1   0   0   0   1

在这种情况下,我只想返回值为 1 的字段名称 'BEE'

我发现 SHOW FIELDS 可以获取字段的名称,但我怎么能说显示字段值 = 1 的字段名称?

【问题讨论】:

  • +1 只是因为我很想知道它是否可以在没有过多代码的情况下完成。
  • 这不是 SQL 所做的,真的。错误的工作工具。
  • 很遗憾您使用的是 MySQL,或者您可以在 SQL Server 中使用 pivot/unpivot 运算符。但是,说真的,为什么要在数据库端这样做?
  • 我同意这很不寻常——它更多的是学术兴趣...... :)
  • 你这样做有什么好处?为什么不只返回所有字段,只使用/显示值为 1 的字段?

标签: sql mysql


【解决方案1】:

我会在这里使用 CASE 语句。

SELECT 
  index, customer_number, 
  CASE
    WHEN abc=0 THEN 'abc'
    WHEN cwd=0 THEN 'cwd'
  END
FROM
  table_name

【讨论】:

    【解决方案2】:

    您不能以一般方式执行此操作。

    你可以这样写一个sql语句:

    select index, customer_number, decode (ABC, 1, "ABC", null) || decode (CWD, 1, "CWD", null) || decode (ROE, 1, "ROE", null) || decode (BEE, 1, "BEE", null) from aTable
    

    它将显示值等于 1 的每个条目的列名。它是oracle sql,所以如果你使用不同的rdbms,语法会有所不同。

    【讨论】:

      【解决方案3】:

      最好的答案是使用 CASE 语句,每列一个。比如:

      SELECT CASE WHEN index=1 THEN "index" ELSE "no_index" END as i,
             CASE WHEN customer=1 THEN "customer" ELSE "no_customer" END as c,
             CASE WHEN ...
      

      【讨论】:

        【解决方案4】:

        这并不是 SQL 真正要做的事情,最好使用应用程序逻辑来完成。

        也就是说,如果你真的想这样做,你可能需要一个临时表和一个 SPROC:

        1. 获取行并确定设置了哪些字段。
        2. 使用该信息创建一个仅包含设置字段的临时表。
        3. 将数据插入该临时表,然后从中选择行。

        如果要替换几行应用程序代码,那将是一大堆 SQL。可能不值得。

        【讨论】:

        • 我的同事也告诉我,最好用应用程序逻辑而不是sql逻辑来尝试。
        猜你喜欢
        • 1970-01-01
        • 2020-10-13
        • 2020-01-13
        • 2019-12-08
        • 2017-10-20
        • 2021-02-05
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        相关资源
        最近更新 更多