sql - PostgreSQL 反向 LIKE 与 json 数组中的模式
问题描述
这个问题与PostgreSQL Reverse LIKE有关
我有一个a
包含 json 列的表a.matchers
。a.matchers
是一个对象数组,每个对象都有属性pattern
给定一个inputString
我想获取至少一个matchers[].pattern
匹配的所有行inputString LIKE '%{pattern}%'
所以基本上(作为伪查询):
SELECT *
FROM a
WHERE
'inputStringABC' LIKE ANY('%' || json_array_elements(a.matchers)->>'pattern' || '%')
这可能吗?
ps: PostgreSQL 版本为 9.6.3
编辑:更广泛的现状描述:
表一:
Column | Type | Modifiers | Storage | Stats target | Description
------------------------------+-----------------------------+-----------------------------------------------+----------+--------------+-------------
uuid | uuid | not null default uuid_generate_v4() | plain | |
matchers | json | | extended | |
列匹配器中的 JSON 结构:
[
{
pattern: string;
}
]
示例用例:
我有一个字符串“有些树看起来比其他树好”,并在表中遵循以下行a
:
uuid: "123...", matchers: [{ pattern: "trees" }]
uuid: "987...", matchers: [{ pattern: "bees" }, { pattern: "plants" }]
查询应返回带有 uuid 的行,"123..."
如trees
发生在"Some trees look nicer than others"
编辑2:
感谢 s-man 对我有用的最终查询
SELECT DISTINCT
uuid,
pattern
FROM (
SELECT
*,
jsonb_array_elements(a.matchers)->>'pattern' as pattern
FROM a
) s
WHERE
'Some trees look nicer than others' LIKE '%' || pattern || '%'
解决方案
表:
id matchers
1 [{"abc": 1, "pattern": "ABC"}, {"pattern": "ABAB"}, {"cde": "FOO", "pattern": "AABB"}]
2 [{"pattern": "AB"}, {"cde": "BAR", "pattern": "CDE"}]
3 [{"abc": 2, "pattern": "CD"}, {"pattern": "FG"}]
查询:
SELECT DISTINCT -- C
id,
matchers
FROM (
SELECT
*,
jsonb_array_elements(a.matchers)->>'pattern' as pattern -- A
FROM a
) s
WHERE
pattern LIKE '%AB%' -- B
A:jsonb_array_elements
将 json 数组扩展为每个数组元素一行。运算符将->>
每个数组元素包含的模式属性的值作为文本给出。
LIKE
B:使用运算符过滤文本值
C:因为表被扩展了,我们必须再次缩小它,因为我们只需要通过子查询保存的每一行中的原始列。
结果:
id matchers
1 [{"abc": 1, "pattern": "ABC"}, {"pattern": "ABAB"}, {"cde": "FOO", "pattern": "AABB"}]
2 [{"pattern": "AB"}, {"cde": "BAR", "pattern": "CDE"}]
如果您的列是类型json
而不是jsonb
您当然必须使用json_array_elements
。
编辑:在使问题更清楚之后,结果表明该模式的用例是相反的。所以将WHERE
子句改为:
'long input string including pattern' LIKE '%' || pattern || '%'
推荐阅读
- c# - 根据Panel中包裹的字符串Label增加Panel的高度
- c# - 是否可以在 Xamarin 中设置低级键盘挂钩?
- python - 为什么我在 Pycharm 中收到不支持的操作数类型错误
- javascript - 如何在 node.js 中调试猫鼬动作
- dart - 在 Dart 中修改 typedef 时出错,将 String 传递给 dynamic,反之亦然
- sabre - 我应该使用什么服务来更改 VCR 和 EMD 中的优惠券状态?
- html - 使用复选框的导航栏
- amazon-web-services - 来自账户 A 的 AWS Cloudwatch 警报无法发布到账户 B 中的 SNS 主题
- javascript - 我想用 javascript 显示新块
- php - 注意“未定义的索引”,但这一直有效,直到我完成代码