Как использовать SQL IN со строкой, содержащей список через запятую? - PullRequest
0 голосов
/ 25 октября 2018

Для одного значения оно отлично работает, когда я преобразую его в текст:

WHERE product_id::text in (inputProduct_ids)

Но у меня возникают проблемы, если существует более одного значения:

CREATE FUNCTION ourFunction(text) { 
    inputProduct_ids text := $1;

    SELECT STRING_AGG(product_id::TEXT, ',' ORDER BY product_id)
    INTO product_ids 
    FROM product_table
    WHERE product_id in ('||inputProduct_ids||');
}

select ourFunction('573, 574 , 575 , 576 , 579 , 580 ,581 , 584');

1 Ответ

0 голосов
/ 25 октября 2018

Если вам действительно нужно передать аргумент в виде строки, вы можете привести его к массиву integer в запросе:

SELECT string_agg(product_id::TEXT, ',' ORDER BY product_id)
INTO product_ids 
FROM product_table
WHERE product_id =ANY (CAST('{' || $1 || '}' AS integer[]));

Оператор =ANY можно использовать с массивами иделает то же самое, что и IN (фактически оптимизатор переводит IN в =ANY внутренне).

Как указывало a_horse_with_no_name, вы также можете использовать string_to_array вместо приведения типа:

WHERE CAST(product_id AS text) =ANY (string_to_array($1, ','))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...