检查包含 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[[:>:]]'

追加[[:&lt;:]] 之前和[[:&gt;:]] 之后,以匹配精确值,| 以匹配多个值。

>>>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 检查值是不是包含多个单词或字符串中的任何一个

如果数据框列值匹配字典键,检查不同的列是不是匹配字典值

如果字符串中的值具有多个点值,如何检查双精度值是不是具有小数部分

如何使用javascript检查剑道网格是不是包含特定项目

检查字符串是不是仅存在于前一个单元格包含 X 的列中?