检查包含 json 字符串的列是不是具有特定值
Posted
技术标签:
【中文标题】检查包含 json 字符串的列是不是具有特定值【英文标题】:Check if column containing json string has specific value检查包含 json 字符串的列是否具有特定值 【发布时间】:2018-03-12 21:08:54 【问题描述】:我有一个这样的“工作”表:
----------------------------------------------
|job_id |name |skills |
----------------------------------------------
|1 |Job 1 |[1] |
|2 |Job 2 |[2,3] |
|3 |Job 3 |[4,5,6] |
----------------------------------------------
“技能”列包含一个 JSON 数组。
我需要选择满足一项或多项技能的工作 - 类似这样(但显然行不通):
SELECT * FROM jobs WHERE skills IN (1,4)
应该返回:
----------------------------------------------
|job_id |name |skills |
----------------------------------------------
|1 |Job 1 |[1] |
|3 |Job 3 |[4,5,6] |
----------------------------------------------
【问题讨论】:
您的JSON DATA
列类型是什么?
字符串类型
他们是你的数据库? postgres 还是 mysql ?
数据库是mysql
JSON 表示处理方式不同。来自:***.com/questions/30411210/… 的第三个答案看起来与您需要的相似:SELECT * FROM jobs WHERE skills->"$.[*]" in (1,4)
?
【参考方案1】:
您可以使用 REGEXP
select * from jobs where skills REGEXP '[[:<:]]1[[:>:]]|[[:<:]]4[[:>:]]'
追加[[:<:]]
之前和[[:>:]]
之后,以匹配精确值,|
以匹配多个值。
>>>Demo<<<
【讨论】:
我不需要使用 \b - 但不能让它工作:sqlfiddle.com/#!9/e62bd3/3 @SimonLobo 没有。你为什么需要那个? 否则在仅搜索 4 时可能会匹配记录 42【参考方案2】:这些查询中的任何一个都将返回您的预期输出。
选项 1
如果skills
是字符串(varchar、文本),您可以使用LIKE
字符串比较函数。
SELECT * FROM jobs WHERE skills LIKE "%1%" OR skills LIKE "%4%";
选项 2
或者,如果您更喜欢正则表达式,您可以使用REGEXP
函数。
SELECT * FROM jobs WHERE skills REGEXP "1|4";
【讨论】:
【参考方案3】:在数据库中存储 JSON 适用于不需要报告或查询所述字段的情况,因为它的效率较低,并且没有充分利用数据库供应商多年的查询性能优化. 我建议使用 2 个表,一个用于工作,另一个用于技能,并在技能表上有一个名为 job_id 的字段,这样您就可以简单地执行如下所示的查询:
select jobs.* from jobs where job.id in (select job_id in Skill where Skill_id in (1,4))
技能表以后可以扩展为具有更多字段或连接到其他技能。
希望有帮助!
【讨论】:
以上是关于检查包含 json 字符串的列是不是具有特定值的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 检查数据库视图中的所有列是不是有特定的字符串值
pandas loc 检查值是不是包含多个单词或字符串中的任何一个