sql - SQL:给定一个字符串数组,过滤字符串列是否部分包含在该数组中
问题描述
表架构
Tags
----
["foo"]
["foo2", "bar"]
["bar", "foo_bar"]
["bar"]
该Tags
列的内容是一个 json 字符串。
假设数组是["foo", "foo_bar"]
,这个数组中包含的任何标签都需要被过滤掉,所以预期的输出将是
Tags
----
["foo2", "bar"]
["bar"]
我目前使用的查询语句类似如下
SELECT tags
FROM table
WHERE (
-- Translate the array into cases
CASE
WHEN tags like '%"foo"%' THEN false -- filter out "foo"
WHEN tags like '%"foo_bar"%' THEN false -- filter out "foo_bar"
... -- filter out others in the given array
ELSE true
END
)
我想知道是否有更有效的方法来做到这一点?
解决方案
如果将数组作为 json 字符串传递,则可以使用JSON1 扩展函数和聚合与HAVING
子句中的条件:
WITH cte(tag) AS (SELECT json_each.value FROM json_each('["foo", "foo_bar"]'))
SELECT t.tags
FROM tablename t, json_each(tags)
GROUP BY t.tags
HAVING SUM(json_each.value IN cte) = 0
见演示。
推荐阅读
- mysql - 如何将我制作的应用程序部署到服务器?
- javascript - 过滤列脚本谷歌表
- javascript - 使用JS函数代替重复代码
- html - 具有四个 div 的 Flex 容器,需要三列,第二列有两行
- css - 内联块和文本对齐不在同一个 div 中工作
- laravel - Laravel - 对都属于某物的用户和对象的策略授权
- node.js - 节点 - 如何在 --watch 期间运行并行命令?
- php - 根据对象内的项目从对象数组中删除项目
- azure - ARM 模板应用服务配置 - 竞争条件/不一致的行为
- django - 如何解决具有多对多关系的石墨烯 django 节点字段