我正在尝试搜索匹配字符串的数组位置,我看到有一个帖子在字符串上有一个字符的位置而不是一个带有数组的字符,这里是我想要实现的一个例子:
array['potato-salad','cucumber-salad','eggplant-pie','potato-soup']
我想知道包含“马铃薯”这个词的元素在哪里,所以结果应该是这样的:
[1,4]
我试图获取所有元素的长度,然后将数组转换为字符串,并搜索字符串以查看字符串匹配的位置,并比较位置是否可以介于任何数组元素长度之间,但是如果我的数组中的元素数量是可变的,并且在我的问题中它是。
,则不起作用答案 0 :(得分:1)
如果您想要完全匹配,请使用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} ║
╚════╩════════╝