SQL Select 语句获取字符串中包含一个或多个值的所有记录

Posted

技术标签:

【中文标题】SQL Select 语句获取字符串中包含一个或多个值的所有记录【英文标题】:SQL Select statement to get all records that contains one or more values in a string 【发布时间】:2021-07-22 11:36:07 【问题描述】:

我被这个问题困住了:

我在wp_postmeta 中制作了3 个自定义meta_key。现在我必须从我提供的字符串中选择包含在meta_value 列中的所有记录,一个或多个单词。

这是我写的 SQL,但它没有返回任何结果,即使我有一个匹配 REGEX 的单词。

 SELECT post_id FROM wp_postmeta WHERE
 meta_key = 'packaging_attributes'
 AND
 meta_key = 'properties_attributes'
 AND
 meta_key = 'tech_functions_attributes'
 AND
 meta_value REGEXP 'chased-floor|chased-wall-plasterboard|alarm-en|0-22|0-220-75|15|25'

这是来自 db: 的截图

正如你在第 1008 行中看到的那样,我有 chased-wall-plasterboard,它应该与上面的选择匹配,然后给我返回 39 结果。但它不起作用。

如果我删除三个 meta_key = column_name,我将获得大量结果,但不会获得 39

【问题讨论】:

你应该使用 OR 而不是 AND。 【参考方案1】:

我假设您真正想要的是在当前WHERE 子句中包含所有 3 个元值的记录的元帖子。如果是这样,那么聚合是一种方法:

SELECT post_id
FROM wp_postmeta
WHERE meta_key IN ('packaging_attributes', 'properties_attributes', 'tech_functions_attributes') AND
      meta_value REGEXP 'chased-floor|chased-wall-plasterboard|alarm-en|0-22|0-220-75|15|25'
GROUP BY post_id
HAVING COUNT(DISTINCT meta_key) = 3;

不清楚meta_value的限制是否真的属于那里。

【讨论】:

谢谢蒂姆,它就像一个魅力。我只需要删除 HAVING COUNT(...),它通过给我返回 id 39 来工作 @d0t_m ... 但删除 HAVING 子句会更改查询。您真正想看到的确切输出是什么? 例如,如果我有 30 种产品包含 ('packaging_attributes', 'properties_attributes', 'tech_functions_attributes') 至少一个词列在 REGEX 中,我希望得到一个 ID 列表.因此,如果在这 30 个中,其中有 22 个进入 meta_value 正则表达式 chased-wall-plasterboard,我想要这 22 个 ID,省略其他 ID。【参考方案2】:

您应该使用 OR 操作来收集所有 4 行。

 SELECT post_id FROM wp_postmeta WHERE
 meta_key = 'packaging_attributes'
 OR
 meta_key = 'properties_attributes'
 OR
 meta_key = 'tech_functions_attributes'
 OR
 meta_value REGEXP 'chased-floor|chased-wall-plasterboard|alarm-en|0-22|0-220-75|15|25'

【讨论】:

以上是关于SQL Select 语句获取字符串中包含一个或多个值的所有记录的主要内容,如果未能解决你的问题,请参考以下文章

Oracle环境,求一个sql语句,如何查询某字段(bz)中包含三个英文字母的连写记录?

MySQL - View 的 SELECT 在 FROM 子句中包含一个子查询

语法错误:在 select 语句中包含存储过程的结果

如何在 Java 中的 Prepared Select 语句中包含参数? [复制]

错误 - 函数中包含的 Select 语句无法将数据返回给客户端

在 hive 的 select 语句中包含子查询结果