【问题标题】:MySQL/MariaDB - Overwrite field value in a SELECT query from within HAVING part of queryMySQL/MariaDB - 从查询的 HAVING 部分覆盖 SELECT 查询中的字段值
【发布时间】:2020-03-26 11:17:39
【问题描述】:

是否可以从查询的HAVING 部分更改SELECT 查询中字段的值?我不想接触数据库中的数据,这只是选择中返回的值。

这是一个人为的例子,因为真正的查询很长而且很复杂。

SELECT t.col1, t.col2, (@all_is_ok = TRUE) as all_is_ok
FROM table t
WHERE t.col1 = 'something'
HAVING (
    (t.col2 = 1 AND t.col3 = 1)
    OR (t.col2 = 2 AND t.col3 = 2)
    OR (SET @all_is_ok = FALSE) /* If we get into this final OR in the HAVING 
                                   then I want the column all_is_ok to be set 
                                   to FALSE so that I still get the row back, 
                                   but can see that the row wasn't as expected */
)

我们使用的是 MariaDB 10.4。

我希望这是有道理的,有人可以提供帮助。谢谢。

【问题讨论】:

  • 请提供样本数据和期望的结果。并且解释您想要实现的逻辑也会有所帮助。
  • 有传言称@variables 将被删除。因此,请努力寻找不同的技术。

标签: mysql sql mariadb


【解决方案1】:

如果要检查所有值是 1/2 还是 1/3,请使用窗口函数:

SELECT t.col1, t.col2,
       (SUM( (t.col2 = 1 AND t.col3 = 1) OR (t.col2 = 2 AND t.col3 = 2) ) OVER () =
        COUNT(*) OVER ()
       )  as all_is_ok
FROM table t
WHERE t.col1 = 'something'

【讨论】:

    【解决方案2】:

    我认为这种行为在 HAVING 中无法实现,例如,您必须将其移至查询的 SELECT 部分

    SELECT t.col1, t.col2, 
    CASE
        WHEN t.col2 = 1 AND t.col3 = 1 THEN 'FINE'
        WHEN t.col2 = 2 AND t.col3 = 1 THEN 'FINE'
        ELSE 'NOT FINE'
    END AS all_is_ok
    FROM table t
    WHERE t.col1 = 'something'
    

    满足任一条件

    AND all_is_ok = 'FINE'

    HAVING all_is_okay = 'FINE'

    我相信两者都可以,但未经测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多