2016-04-05 4 views
1

Я пытаюсь найти позицию массива соответствующей строки, я вижу, что есть столбец с положением символа в строке, но не один с массивом, здесь является примером того, что я хочу добиться:Позиция string-match в массиве PostgreSQL 9.5

array['potato-salad','cucumber-salad','eggplant-pie','potato-soup'] 

Я хочу знать, где элементы, содержащие слово «картофель» есть, так что результат должен быть что-то вроде этого:

[1,4] 

Я пытаясь получить длины всех элементов, затем преобразование массива в строку и поиск строки для см., где строка соответствует и сравнивается, если позиция может находиться между любой из длин элементов массива, но это не работает, если мое число элементов в массиве является переменным, и в моей проблеме это так.

ответ

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} ║ 
╚════╩════════╝ 
Смежные вопросы