2016-08-21 5 views
3

Я передаю строку в качестве параметра (через arrayjs) в свой запрос. Строка форматируется как: param = 'red, blue, green'. Параметр сам по себе не имеет фиксированной длины (',' является разделителем), поскольку он заполняется через то, что пользователь отправляет (но имеет максимальное значение на 10 элементов).Как многоразделить строку (запрос WHERE IN)

Как сломать строку в отдельные строки внутри моего запроса?

Например, что я пытаюсь сделать:

SELECT * FROM table 
WHERE name IN (param); 

Я знаю, что это работает, но очень и очень сырой:

SELECT * FROM table 
WHERE name IN (split_part(param, ',', 1), split_part(param, ',', 2) .......)) -- keep going. 

По существу я хочу иметь («красный», «синий» , 'green' ....) внутри круглых скобок IN. Есть ли лучший способ сделать это?

ответ

1

Вы можете использовать функцию string_to_array, чтобы разбить строку на массив, а затем использовать функцию any, чтобы проверить, если ваш элемент содержится в нем:

SELECT * 
FROM mytable 
WHERE name = ANY(STRING_TO_ARRAY(param, ',')); 
+1

отлично работает спасибо! Быстрое наблюдение: как бы я настроить его для обработки целых чисел? То есть, если таблица имела целые числа. Что-то вроде to_number применимо здесь? – Suman

+1

@SumanBhattarai В таком случае я бы поставил колонку в строку, поэтому вы сравниваете яблоки с яблоками. AFAIK, Postgres не имеет удобного способа применения функции ко всем элементам в массиве. – Mureinik