字符串匹配在 PostgreSQL 9.5 数组中的位置
Position of string-match in PostgreSQL 9.5 array
我正在尝试搜索匹配字符串的数组位置,我看到有一个 post 带有字符串中字符的位置,但没有带有数组的位置,这里是一个示例我想要实现的目标:
array['potato-salad','cucumber-salad','eggplant-pie','potato-soup']
我想知道包含单词'potato'的元素在哪里,所以结果应该是这样的:
[1,4]
我试图获取所有元素的长度,然后将数组转换为字符串,然后搜索字符串以查看字符串匹配的位置并比较该位置是否可以位于任何数组元素长度之间,但如果我的数组中的元素数量是可变的,这就不起作用,而在我的问题中它是。
如果您想要完全匹配,请使用 array_positions
:
CREATE TABLE my_tab(ID INT, col VARCHAR(100)[]);
INSERT INTO my_tab(ID, col)
VALUES (1, array['potato-salad','cucumber-salad','eggplant-pie','potato-soup']),
(2, array['potato']);
查询:
SELECT *
FROM my_tab
,LATERAL array_positions(col, 'potato-salad') AS s(potato_salad_position)
WHERE s.potato_salad_position <> '{}';
输出:
╔════╦════════════════════════════════════════════════════════╦═══════════════════════╗
║ id ║ col ║ potato_salad_position ║
╠════╬════════════════════════════════════════════════════════╬═══════════════════════╣
║ 1 ║ {potato-salad,cucumber-salad,eggplant-pie,potato-soup} ║ {1} ║
╚════╩════════════════════════════════════════════════════════╩═══════════════════════╝
如果您想使用 LIKE
通配符搜索,您可以使用 unnest WITH ORDINALITY
:
SELECT id, array_agg(rn) AS result
FROM my_tab
,LATERAL unnest(col) WITH ORDINALITY AS t(val,rn)
WHERE val LIKE '%potato%'
GROUP BY id;
输出:
╔════╦════════╗
║ id ║ result ║
╠════╬════════╣
║ 1 ║ {1,4} ║
║ 2 ║ {1} ║
╚════╩════════╝
我正在尝试搜索匹配字符串的数组位置,我看到有一个 post 带有字符串中字符的位置,但没有带有数组的位置,这里是一个示例我想要实现的目标:
array['potato-salad','cucumber-salad','eggplant-pie','potato-soup']
我想知道包含单词'potato'的元素在哪里,所以结果应该是这样的:
[1,4]
我试图获取所有元素的长度,然后将数组转换为字符串,然后搜索字符串以查看字符串匹配的位置并比较该位置是否可以位于任何数组元素长度之间,但如果我的数组中的元素数量是可变的,这就不起作用,而在我的问题中它是。
如果您想要完全匹配,请使用 array_positions
:
CREATE TABLE my_tab(ID INT, col VARCHAR(100)[]);
INSERT INTO my_tab(ID, col)
VALUES (1, array['potato-salad','cucumber-salad','eggplant-pie','potato-soup']),
(2, array['potato']);
查询:
SELECT *
FROM my_tab
,LATERAL array_positions(col, 'potato-salad') AS s(potato_salad_position)
WHERE s.potato_salad_position <> '{}';
输出:
╔════╦════════════════════════════════════════════════════════╦═══════════════════════╗
║ id ║ col ║ potato_salad_position ║
╠════╬════════════════════════════════════════════════════════╬═══════════════════════╣
║ 1 ║ {potato-salad,cucumber-salad,eggplant-pie,potato-soup} ║ {1} ║
╚════╩════════════════════════════════════════════════════════╩═══════════════════════╝
如果您想使用 LIKE
通配符搜索,您可以使用 unnest WITH ORDINALITY
:
SELECT id, array_agg(rn) AS result
FROM my_tab
,LATERAL unnest(col) WITH ORDINALITY AS t(val,rn)
WHERE val LIKE '%potato%'
GROUP BY id;
输出:
╔════╦════════╗
║ id ║ result ║
╠════╬════════╣
║ 1 ║ {1,4} ║
║ 2 ║ {1} ║
╚════╩════════╝