2016-12-14 3 views
0

Я выполняю SQL-запрос с использованием формата execute, который требует передачи нескольких переменных в качестве параметра. Здесь мой запрос требует много символов, таких как: '%' and ','Postgresql: более 100 параметров для запроса формата выполнения

Следовательно, мой запрос был настолько большим, что он превысил предел 100 параметров. Таким образом, есть способ включить '%' and ',' в самом запросе, а не передавать его в качестве параметра.

Запрос:

execute format('CREATE MATERIALIZED VIEW %I AS 
     SELECT id, 
       (select count(*) from friends bob where (i.name ilike any (string_to_array(replace(concat(%L,bob.keywords,%L),%L,%L),%L)) or 
i.description ilike any (string_to_array(replace(concat(%L,bob.keywords,%L),%L,%L),%L)) or 
i.additional_info ilike any (string_to_array(replace(concat(%L,bob.keywords,%L),%L,%L),%L)) or 
i.eventful_category ilike any (string_to_array(replace(concat(%L,bob.keywords,%L),%L,%L),%L)) or 
i.other_category ilike any (string_to_array(replace(concat(%L,bob.keywords,%L),%L,%L),%L)))) as friend_bob 
from events i ','FrienView','%','%',',','%,%',',','%','%',',','%,%',',','%','%',',','%,%',',','%','%',',','%,%',',','%','%',',','%,%',',') 
+1

Как и где ты создавая строки запроса? –

+0

@TimBiegeleisen Обновил мой вопрос по запросу. Это всего лишь часть запроса, в дальнейшем он будет включать аналогичный тип запроса для генерации большего количества столбцов по мере необходимости –

+0

Запрос, созданный в MOUNT DOOM. –

ответ

1

По docs

The concat , concat_ws and format functions are variadic, so it is possible to pass the values to be concatenated or formatted as an array marked with the VARIADIC keyword

Вы можете использовать ARRAY преодолеть ограничения, например: подготовить:

with n as (select generate_series(1,101,1) g) 
    select $$SELECT format('$$||string_agg('%s',',')||$$',$$||string_agg(g::text,',')||')' 
    from n;  

пробег:

SELECT format('%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s',1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101); 

ERROR: cannot pass more than 100 arguments to a function

как массив:

SELECT format('%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s' 
,VARIADIC ARRAY[1, 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101]); 

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101 (1 row)

Но я хотел бы остановиться и подумать здесь - действительно ли вы хотите передать 100 аргументов ..

Смежные вопросы