2016-01-20 3 views
0

Итак, я сравниваю две базы данных Oracle, захватывая случайные строки в базе данных A и ищу эти строки в базе данных B на основе своих ключевых столбцов. Затем я сравниваю строки, которые возвращаются в java.Oracle Выбор столбцов с предложением IN, который включает значения NULL

Я использую следующий запрос для поиска строк в базе данных B, используя ключевые столбцы из базы данных A:

select * from mytable 
Where (Key_Column_A,Key_Column_B,Key_Column_C) 
in (('1','A', 'cat'),('2','B', 'dog'),('3','C', '')); 

Это работает нормально для первых двух наборов ключей, а третий ключ ('3 ',' C ',' ') не работает, потому что в третьем столбце есть нулевое значение. Изменение заявление ('3', 'C', NULL) или изменения SQL для

select * from mytable 
Where (Key_Column_A,Key_Column_B,Key_Column_C) 
in ((('1','A', 'cat'),('2','B', 'dog'),('3','C', '')) 
OR (Key_Column_A,Key_Column_B,Key_Column_C) IS NULL); 

не будет работать.

Есть ли способ включить нулевой столбец в предложение IN? А если нет, есть ли способ эффективно сделать то же самое? (Моим единственным решением в настоящее время является создание проверки, чтобы убедиться, что в моих ключах нет нулевых столбцов, что сделало бы этот процесс довольно неэффективным и несколько грязным).

+0

Вы генерируете эту инструкцию SELECT динамически? –

+0

@BobJarvis да, я. – JoshKni8

ответ

2

Вы можете использовать его таким образом. Я думаю, это сработает.

select * from mytable 
    Where (NVL(Key_Column_A,''),NVL(Key_Column_B,''),NVL(Key_Column_C,'')) 
    in (('1','A', 'cat'),('2','B', 'dog'),('3','C', '')); 

Я не уверен об этом (Key_Column_A,Key_Column_B,Key_Column_C) IS NULL. Разве это не означает, что все столбцы (A, B, C) равны NULL?

+0

NVL - это неизвестная команда в моей версии Oracle. Эта попытка была основана на ответе, который я увидел здесь: http://stackoverflow.com/questions/6362112/in-clause-with-null-or-is-null – JoshKni8

+0

Я не знаю о вашей версии. Используйте эквивалент, и он будет работать. Например, «Coalesce». – DukeOfHazard

+0

Btw, нить, которую вы поделили, отличается от вашей. Он сравнивает значение со списком. Здесь вы сравниваете список со списком. – DukeOfHazard

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