gpt4 book ai didi

MySQL - 选择某些值为空的行

转载 作者:行者123 更新时间:2023-11-29 05:18:57 26 4
gpt4 key购买 nike

我有“foo”、“bar”和“buz”的值。我想从下表中选择第 1 行和第 3 行:

+----+------+------+------+
| Id | Col1 | Col2 | Col3 |
+----+------+------+------+
| 1 | foo | | |
| 2 | foo | bar | buz |
| 3 | | bar | buz |
+----+------+------+------+

考虑到以下因素,最佳的 MySQL 查询是什么:

  • 空格为空
  • 我有 n 列,其中 4 < n < 20
  • 会有几百行
  • 我将在一行中选择特定的列组合,其中只能设置提供的值,其余值必须为空。例如:我需要这样的查询

SELECT * FROM my_table WHERE Col1 = foo OR (Col2 = bar AND Col3 = buz);

这将只返回第 1 行和第 3 行。

换句话说,我希望有一个查询只返回具有某些值组合的行,而不是 coln = 'some_val' 所在的行。我们不关心其他人。

这样做的原因是我想在 1 个查询中有 5 个组合并且我想避免写 (...) coln <> NULL(...)无处不在。

非常感谢您的建议。

最佳答案

您将使用 where 子句。要找到这三个值:

where 'foo' in (col1, col2, col3, . . . ) or
'bar' in (col1, col2, col3, . . . ) or
'buz' in (col1, col2, col3, . . . )

将结果限制为这三个值更加困难。您需要对每一列进行比较:

where ( (col1 in ('foo', 'bar', 'buz') or col1 is null) or
(col2 in ('foo', 'bar', 'buz') or col2 is null) or
. . .
)

如果您不想全部输入,可以使用电子表格生成代码。

另一种选择是以下拼凑:

where replace(replace(replace(concat_ws('', col1, col2, col3, . . . ),
'foo', ''
), 'bar', ''
), 'buz', ''
) = ''

这会将值连接在一起,然后删除您关心的值。如果删除所有内容,则该行匹配。

注意:此问题表明您的数据结构不佳。您将内容存储在本应成行的列中。

关于MySQL - 选择某些值为空的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28717563/

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