2016-04-13 2 views
2

У меня есть таблица с именем CompApps, и я хочу получить определенные записи на основе запроса нескольких условий. Мой SQL очень ржавый, и поэтому я спрашиваю о переполнении стека. Мне нужно изменить SQL ниже, чтобы включить предложение where, которое будет исключать записи, которые не имеют никакой соответствующей информации в полях Интерфейс, ExAPI, ExtraInfo, OpenCol. То есть, в образе текущих результатов запроса ниже Я хочу строк 170, 173, 174, 175, 177, 182, 185, 190, а не строки, которые имеют только значение None, N \ A или пустое значение в интерфейсе, ExAPI, ExtraInfo, OpenColКомплексный SQL Query Filter

SELECT RefNum, Interface, ExAPI, ExtraInfo, OpenCol 
FROM CompApps 

enter image description here

+0

зачистить данных, использование NULL везде у вас есть N/A или пусто. Затем сделайте что-то вроде «где coalesce (c1, c2, c3, c4) равно null». – jarlh

ответ

3

Или, может быть, как это

исправляющих это в соответствии с комментарием dnoeth по:

SELECT RefNum, Interface, ExAPI, ExtraInfo, OpenCol 
FROM CompApps 
WHERE Interface NOT IN('None','N/A') 
    OR ExAPI NOT IN('None','N/A') 
    OR ExtraInfo NOT IN('None','N/A') 
    OR OpenCol NOT IN('None','N/A'); 
+3

Вам не нужно проверять 'IS NOT NULL' как' NOT IN' уже удаляет 'NULLs' ... – dnoeth

+0

@dnoeth Thx много. Я такой защитный программист, что я никогда не замечал этого ... *** *** *** Я попробовал 'declare @tbl table (i int); вставлять в значения @tbl (1), (2), (NULL); выберите * from @tbl, где я не в (1); 'и вы правы ... Единственное, о чем я сейчас думаю: почему это так? – Shnugo

+0

Потому что '(NOT IN (x, y))' является ярлыком для '(значение <> a И значение <> b)', и любое сравнение с NULL приводит к 'unknown', который является' NOT TRUE' – dnoeth

0

Попробуйте это:

SELECT 
    RefNum, Interface, ExAPI, ExtraInfo, OpenCol 
FROM 
    CompApps 
WHERE 
    (Interface IS NOT NULL AND (Interface !='None' AND Interface !='N/A')) 
OR 
    (ExAPI IS NOT NULL AND (ExAPI != 'None' AND ExAPI != 'N/A')) 
OR 
    (ExtraInfo IS NOT NULL AND (ExtraInfo != 'None' AND ExtraInfo != 'N/A')) 
OR 
    (OpenCol IS NOT NULL AND (OpenCol != 'None' AND OpenCol != 'N/A')) 
+0

Если 'Interface = 'None'' будет принят в вашем запросе из-за' Interface! =' None 'OR Interface! =' N/A''. «Интерфейс» не «N/A», поэтому он возвращается в ваш вывод. Итак, нет, это еще не все ... – HoneyBadger

+0

@ Просто потому, что вы обратились ко мне напрямую: я не был нисходящим ... и HoneyBadger уже указал на недостатки ... – Shnugo

+0

Я так не думаю , потому что ** ColumName! = 'a' ИЛИ ​​ColumnName! = 'b' ** также эквивалентно высказыванию ** ColumnName NOT IN ('a', 'b') ** (пожалуйста, подтвердите, как это работает правильно для меня) @HoneyBadger –

0
where 
(
    (ISNULL(ExAPI, '') <> '' OR ExAPI <> 'N/A' OR ExAPI <> 'None') 
    OR 
    (ISNULL(ExtraInfo, '') <> '' OR ExtraInfo<> 'N/A' OR ExtraInfo<> 'None') 
    OR 
    (ISNULL(OpenCol, '') <> '' OR OpenCol<> 'N/A' OR OpenCol<> 'None') 
) 
+2

Вы можете прочитать о 'ISNULL()' function и "sargable" – Shnugo

0

Попробуйте

SELECT RefNum, Interface, ExAPI, ExtraInfo, OpenCol 
FROM CompApps 
WHERE (Interface NOT IN ('','None','N/A')) 
    OR (ExAPI NOT IN ('','None','N/A')) 
    OR (ExtraInfo NOT IN ('','None','N/A')) 
    OR (OpenCol NOT IN ('','None','N/A')) 
+0

Вы можете прочитать о функции ISNULL() и «sargable» – Shnugo

+0

@Shnugo, спасибо, я не рассмотрел производительность ... – Nino

+0

@ Шнуго, спасибо, и я думаю, что он должен также исключить пустое значение. (он упоминается в строках вопроса *, которые имеют только значение None, N \ A или пустое значение *) –