【问题标题】: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 表示处理方式不同。来自:stackoverflow.com/questions/30411210/… 的第三个答案看起来与您需要的相似:SELECT * FROM jobs WHERE skills->"$.[*]" in (1,4) ?

标签: mysql sql arrays json string


【解决方案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))

    技能表以后可以扩展为具有更多字段或连接到其他技能。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2020-04-14
      • 1970-01-01
      相关资源
      最近更新 更多