【问题标题】:How to match perfect number using like operator in sql如何在sql中使用like运算符匹配完美数字
【发布时间】:2019-02-15 19:25:17
【问题描述】:

在我的数据库中,我有一个将 json 对象存储为文本数据类型的表

例子:

表名users

id | role_ids | is_active
---+----------+----------
1  | [1, 3, 5]| t
2  | [1]      | t

这里role_ids列是json对象,存储为文本

我需要使用like 运算符根据role_ids 查询用户

例子:

SELECT id FROM users WHERE role_ids LIKE '%1%';

在这种情况下,假设 role_ids 字段的值为 91,或者将选择任何其他值为 1 的值,

我如何通过在SQLite 中使用单个查询来选择完全为 1 的行

【问题讨论】:

  • mysql 还是 postgresql ?
  • ... 还是 SQLite?
  • @Oto Shavadze 我知道如何将它与 postgresql 一起使用,这非常简单我只需要使用 @> 就是这样,但我想知道我们如何使用 mysql 或 sqlite3 实现相同的东西
  • @TimBiegeleisen sqlite
  • 那你的问题要明确!

标签: mysql postgresql sqlite


【解决方案1】:

我会为此目的使用正则表达式,因为您正在寻找一个特定的数字意味着该数字不被数字字符跟随或引导:

SELECT id FROM users WHERE role_ids REGEXP '[^0-9]1[^0-9]'

SQLFiddle

【讨论】:

  • 我更喜欢这个而不是我的答案,至少在这种特殊情况下是 +1。
  • @TimBiegeleisen 谢谢你,我很欣赏你的公平行为
【解决方案2】:

假设role_ids 列只有一个级别的 JSON 数组,我们可以尝试将该值转换为纯 CSV 值,然后进行LIKE 比较:

SELECT id
FROM users
WHERE
    ',' || REPLACE(SUBSTR(role_ids, 2, length(role_ids) - 1), ' ', '') || ','
        LIKE '%,1,%';

这是字符串操作的进程,例如反对[1, 3, 5]

[1, 3, 5]
1, 3, 5     (after SUBSTR)
1,3,5       (after REPLACE)
,1,3,5,     (after ||)

使用,1,3,5, 格式的角色,可以轻松检查任何角色。附带说明一下,您应该避免在数据库表中存储未规范化的数据。

【讨论】:

  • 可以不用转换成另一种格式,因为我在 SO 的某个地方看到了其中一种方式,但我忘记了
  • SQLite 似乎提供了一些 JSON 函数,但我不知道它们是否会在 Android 上可用。
  • but it is not working ...您认为这有助于我更新答案吗?你能说得更具体点吗?
  • 要启用 json 功能,我们需要启用 JSON1 Extension。那就是 sqlite3.9 本身不支持 json 或 jsonb 函数。要启用 json1 扩展,我需要构建编译 JSON1 Extension 的 sqlite3.9。但不知道该怎么做
  • 嗯...Java 端的 Android 肯定支持丰富的 JSON API。也许您可以在您的应用程序中而不是在数据库中进行检查?
猜你喜欢
  • 2021-08-30
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多