2015-12-20 2 views
1

В качестве дополнения к этому question, можно ли включить подстановочные знаки с postgres?WHERE IN с составными клавишами и подстановочными знаками (postgres)

E.g. Нечто подобное (обратите внимание на подстановочные, чтобы выбрать все записи, где key_part_1 имеет значение «C»):

SELECT * 
    FROM table_name 
WHERE (key_part_1, key_part_2) IN (('B',1), ('C',?)); 

Возможно ли это, и если да, то, что синтаксис?

+1

'WHERE (key_part_1, key_part_2) IN (('B', 1), ('C', key_part_2));' Это то, что вам нужно? – lad2025

+0

Спасибо. Напишите ответ, и я приму его. – jbrown

ответ

0

Вы можете использовать один и тот же столбец в IN пункте (если оба столбец не обнуляемый):

SELECT * 
FROM table_name 
WHERE (key_part_1, key_part_2) IN (('B',1), ('C',key_part_2)); 

Таким образом, для второй пары значений будет использоваться только key_part_1='C' потому key_part_2=key_part_2 всегда верно.

WHERE (key_part_1, key_part_2) IN (('B',1), ('C',key_part_2)); 
<=> 
WHERE (key_part_1='B' AND key_part_2 = 1) 
    OR (key_part_1='C' AND key_part_2 = key_part_2); 


Если столбцы могут быть обнуляемым вы можете обернуть его COALESCE(column_name, value) как:

SELECT * 
FROM tab 
WHERE (key_part_1, COALESCE(key_part_2,-1)) IN (('B',1), 
               ('C',COALESCE(key_part_2,-1))); 

SqlFiddleDemo

Обратите внимание, что значение, используемое в COALESCE должны отличаться для фактических данных чтобы избежать коллизий.

+0

Это произойдет, если key_part_2 окажется NULL. ('NULL = NULL' является ложным в SQL) – wildplasser

+0

@wildplasser Пожалуйста, прочитайте первое предложение, я обновлю его. – lad2025

1

Если key_part_2 может быть чем угодно, нет необходимости его проверять.

SELECT * 
    FROM table_name 
WHERE (key_part_1, key_part_2) IN (('B',1)) 
    OR key_part_1 IN('C') 
    ; 
Смежные вопросы