2017-01-27 19 views
0

Я мог бы просто сделать это с условной логикой, но думал, что спрошу, могу ли я сделать это в одном запросе. Я хочу, чтобы ограничить результат запроса на основе массива идентификаторов, но если массив пуст, я хотел бы вернуть все строки:postgres: no op join clause for function

CREATE OR REPLACE FUNCTION maybe_filter(arr integer[]) 
    RETURNS TABLE(...) 
    LANGUAGE sql 
AS $function$ 
     select * 
     from some_table st 
     join (select distinct unnest($1) id order by 1) arr 
      on st.id = arr.id OR ... 
$function$; 

ответ

0

Я понял это во время написания вопроса. Doh. Но не хотелось бы лишать мир моей хитрости <-), поэтому отправляйте q/a, а не просто возвращайтесь к работе.

CREATE OR REPLACE FUNCTION maybe_filter(arr integer[]) 
    RETURNS TABLE(...) 
    LANGUAGE sql 
AS $function$ 
     select * 
     from some_table st 
     where array_length($1,1) = 0 or st.id = any($1) 
$function$; 
+1

'array_length ($ 1,1)' также может быть записан как «мощность ($ 1)» –

+0

Спасибо. На самом деле мое решение, похоже, не работает. (: Не уверен, что еще нет. – Sigfried

+0

О, может быть, это была проблема с кардинальностью? Прежде чем он вернул 0 строк мгновенно, после изменения array_length на мощность это займет много времени, поэтому, вероятно, это работает ... Да, это сработало Спасибо, почему бы это работать, а не array_length = 0? – Sigfried