2015-06-26 2 views
0

У меня есть таблица, содержащая идентификатор следующим образом:выберите строки, не содержащиеся в таблице

ID 
---------------- 
10000V9F 
10000V9O 
10000VAh 
10000VCB 
10000VDn 
10000VE9 
10000VF4 
10000VFE 
10000VFH 
10000VFW 
10000VG9 

Теперь я хочу, чтобы получить все данные из другой таблицы, которая не имеет ни одного из этих идентификаторов. Therefor создать запрос, подобный этому:

SELECT * from TABLE1 where ID NOT IN (...) 

Где ... список идентификаторов приобретаемых с помощью другого запроса, и который содержит все ранее упомянутые идентификаторы из первой таблицы. Этот список определяется следующим образом:

string idString = "'" + String.Join("'", this.GetIDsForTableNames(newTables).ToArray()) + "'"; 

Метод GetIDsForTableNames также может возвращать пустой список, не содержащий на всех элементов. В этом случае результирующий запрос сверху приведет к чему-то вроде этого:

SELECT * from TABLE1 where ID NOT IN ('') 

Что я ожидаю, чтобы вернуть все идентификаторы из TABLE1. Но вместо этого возвращается NONE. Однако когда я стреляю SELECT * from TABLE1 where ID NOT IN ('a'), где a - это просто манекен, все строки из TABLE1 возвращаются.

Итак, как я могу обрабатывать список-пустую-дело подходящим образом или почему он не работает с пустым списком?

EDIT: Хорошо, кажется, что некоторые окрестности недостаточно ясны. Поскольку я не создаю self-строку SQL (это делается с помощью стороннего инструмента), я могу только изменить whereclause, который является лишь своего рода минимальным SQL (подзапросы и объединения не поддерживаются). Вот почему я использовал ID IN -техник.

+0

Как вы строите команду select (а не idString)? –

+0

Когда список идентификаторов пуст и IN ('') не работает, я боюсь, что единственным грязным решением является вставить idstring в непустое значение, которое никогда не будет встречено как Id. – Graffito

+0

@ Graffito Вот что я уже упоминал с помощью фиктивной ценности. Yeap, это, вероятно, путь. – HimBromBeere

ответ

1

Почему он не работает с пустым списком?

Это из-за 2-х вещей:

1. Oracle рассматривает пустые строки как пустые значения

Таким образом, ваш запрос:

SELECT * from TABLE1 where ID NOT IN ('') 

фактически является эквивалентной:

SELECT * from TABLE1 where ID NOT IN (NULL) 

2. НЕ В поведении

Предложение NOT IN может быть упрощена проверка всех значений против списка. Если результатом любого значения является TRUE (значение находится в списке) или NULL, тогда тест не выполнен.

Все проверки возвращают NULL, поэтому ваш запрос не возвращает строку.

Именно поэтому он не работает с пустым списком в Oracle.

Возвращаясь к вашему вопросу:

, как я могу справиться с прейскурантной-это-порожнего случай appropriatly

Вы должны найти другой способ, чем получение идентификаторов и их включение в NOT IN пункт.
Поскольку у вас нет никакого контроля над запросом, вам нужно будет включить подробную информацию о своем трехстороннем инструменте и надеяться, что есть обходной путь.

Более подробную информацию об этом:


Примечание:(только в случае, если некоторые пользователи SQL Server найти этот пост)
Если вы используете SQL Server, ваш запрос будет работать, потому что пустые строки не обрабатываются как NULL.
Даже второй запрос SELECT * from TABLE1 where ID NOT IN (NULL) будет работать, если вы установили ANSI_NULLS в OFF. Такая настройка недоступна в Oracle.

+0

Действительно хороший ответ, не знал, что у оракула есть такая специальная обработка. – HimBromBeere

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