【问题标题】:Display WHERE condition values that match in selected fields显示在选定字段中匹配的 WHERE 条件值
【发布时间】:2018-12-17 15:43:12
【问题描述】:

假设我有一个名为 Citizens 的表,其中包含这些字段和值:

| ID | Name   | Age |
|----|:------:|---: |
| 1  | King   | 60  |
| 2  | Queen  | 50  |
| 3  | Prince | 25  |

如果我想显示年龄介于“50100”之间的公民以及介于“5”之间的其他人>30”,我可以像这样使用一个简单的 WHERE 条件:

SELECT * FROM Citizens WHERE (Age BETWEEN 5 AND 30 ) OR (Age BETWEEN 50 AND 100 );

但是,问题来了:如何在符合条件的每一行旁边显示最小和最大请求的年龄以具有类似的内容?

| ID | Name   | Age |INTERVAL|
|----|:------:|:---:|-------:|
| 1  | King   | 60  | 50-100 |
| 2  | Queen  | 50  | 50-100 |
| 3  | Prince | 25  |  5-30  |

【问题讨论】:

    标签: mysql sql eloquent


    【解决方案1】:

    您可以使用CASE 表达式:

    SELECT Id, Name, Age,
        CASE WHEN Age BETWEEN 5 AND 30 THEN '5-30'
             WHEN Age BETWEEN 50 AND 100 THEN '50-100'
             ELSE 'OTHER' END AS INTERVAL
    FROM Citizens
    WHERE (Age BETWEEN 5 AND 30) OR (Age BETWEEN 50 AND 100);
    

    注意:我不确定您是否只想显示某些年龄段。如果是这样,请保持当前的WHERE 子句不变。如果您想包含所有数据,则删除 WHERE 子句。在这种情况下,不匹配的范围将被报告为OTHER

    另一种可能更好地扩展的方法是使用间隔表:

    start | end | interval
    5     | 30  | 5-30
    50    | 100 | 50-100
    

    然后加入这个表,带入区间标签:

    SELECT c.Id, c.Name, c.Age, i.interval
    FROM Citizens c
    INNER JOIN interval i
        ON c.Age BETWEEN i.start AND i.end
    WHERE (c.Age BETWEEN 5 AND 30) OR (c.Age BETWEEN 50 AND 100);
    

    第二种方法的一个主要优点是可以引入索引策略。

    【讨论】:

    • ...现在蒂姆打败了我。
    • @TheImpaler 我刚刚在 GROUP BY 问题上为你投票 :-)
    • 它可以工作,但让我们考虑到我们确实有很多时间间隔需要研究,这个提案不会产生一些巨大/长的查询吗?
    • @CfassKing 检查我更新的答案以获取避免CASE 表达式的连接选项。
    • 好的,我将使用临时表对其进行测试,之后我会回来。谢谢。
    【解决方案2】:

    我会使用CASE 声明:

    SELECT
      id, name, age,
      case when age between 5 and 30 then '5-30' else '50-100' end as interval
    FROM Citizens
    WHERE (Age BETWEEN 5 AND 30 ) OR (Age BETWEEN 50 AND 100 );
    

    【讨论】:

    • 谢谢,打错了。
    • 它可以工作,但让我们考虑到我们确实有很多时间间隔需要研究,这个提案不会产生一些巨大/长的查询吗?
    • 是的,它会的。我没有看到比这个更简洁的解决方案,除非间隔存储在一个单独的表中,就像在 Tim 的解决方案中一样。
    • 使用 SQL FUNCTION 怎么样?
    • SQL 函数仍然需要枚举所有情况。我没有看到打字有任何节省。不过,您的 SQL 看起来会 [人为地] 更短。
    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多