gpt4 book ai didi

MySQL - 选择值 = X 的行,或者如果没有匹配项,则选择值 = null

转载 作者:可可西里 更新时间:2023-11-01 07:38:17 25 4
gpt4 key购买 nike

我怎样才能在表中找到 val_b 具有特定值的所有行,但如果不存在这样的行,我想看看是否有匹配度较低的行,因此在哪里val_b 为 null

从下表中,我想选择 val_a = Xval_b = T 的位置,并获取 ID:1 的行回来。

如果我选择 val_a = Xval_b = V 并获取包含 ID:3ID:4< 的行 回来。由于行 12 不匹配,我将使用特异性较低但仍匹配 val_a 的行。

| ID | val_a | val_b |
| -- | ----- | ----- |
| 1 | X | T |
| 2 | X | U |
| 3 | X | null |
| 4 | X | null |
| 5 | Y | null |

这可以直接在数据库查询中进行吗?类似于语法上左结合的 XOR 运算符...

最佳答案

试试这个查询:

SELECT ID, val_a, val_b
FROM yourTable
WHERE
val_a = 'X' AND (val_b = 'V' OR
(NOT EXISTS (SELECT 1 FROM yourTable
WHERE val_a = 'X' AND val_b = 'V') AND val_b IS NULL));

enter image description here

Demo

这里的逻辑是,如果以下条件之一为真,我们将保留一条记录:

  • val_b 匹配预期的(非 NULL)值,或者
  • val_b 为 NULL 并且没有匹配的非 NULL val_b 记录

EXISTS 子句涵盖了第二种情况,它断言没有匹配的非 NULL val_b 记录。

当搜索 val_a = 'X'val_b = 'T' 时,使用上述查询仅返回 ID:1 记录.

如果您使用的是 MySQL 8+,那么我们可以在此处使用分析函数:

WITH cte AS (
SELECT ID, val_a, val_b,
COUNT(CASE WHEN val_a = 'X' AND val_b = 'V' THEN 1 END)
OVER () cnt
FROM yourTable
)

SELECT ID, val_a, val_b
FROM cte
WHERE val_a = 'X' AND (val_b = 'V' OR (val_b IS NULL AND cnt = 0));

Demo

但请注意,即使在这种情况下,我们仍然需要使用子查询。

关于MySQL - 选择值 = X 的行,或者如果没有匹配项,则选择值 = null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53852516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com