Проблема SQL с предложением where и оператором AND

#sql

Вопрос:

У меня проблема, потому что я хотел бы выбрать некоторые A11, C11, ZH11 с указанием где и и. Однако, когда я это делаю и выбираю только первое условие A11

 proc sql; create table zabcheck_hip as select  zab_data_spr ,sum(zab_hip) as ZAB_HIP from _mart.zab_kred  where zab_data_spr=amp;gv_date_dly. and zab_hip = 1 and ZAB_KOD = 'A11' AND 'C11' and 'ZH1' group by zab_data_spr ; quit;  

когда я пытаюсь сделать, как показано ниже. У меня пустая таблица, но я знаю, что, например, для C11 должно быть много результатов

 proc sql; create table zabcheck_hip as select  zab_data_spr ,sum(zab_hip) as ZAB_HIP from _mart.zab_kred  where zab_data_spr=amp;gv_date_dly. and zab_hip = 1 and ZAB_KOD = 'A11' AND ZAB_KOD = 'C11' and ZAB_KOD = 'ZH1' group by zab_data_spr ; quit;  

если я выбираю один за другим, это показывает мне результаты, в которых я совершаю ошибку

Комментарии:

1. where zab_data_spr=amp;gv_date_dly. and zab_hip = 1 and (ZAB_KOD = 'A11' OR ZAB_KOD = 'C11' OR ZAB_KOD = 'ZH1')

2. ZAB_KOD не может иметь 3 значения одновременно. Вы не имеете в виду OR (или IN() для удобства чтения)?

Ответ №1:

ZAB_KOD = 'A11' AND 'C11' and 'ZH1'

Это не имело бы смысла для компьютера — это то, что делают люди, когда они говорят:

«Пройдите через эту коробку, достав все красные и зеленые шарики»

Шар не может быть одновременно красным и зеленым; он красный ИЛИ зеленый. Как человек, мы знаем, как это понять, но на самом деле человек просит: «пройдите через эту коробку с шариками; если шарик красный или если шарик зеленый, достаньте его».

Истинность предложения where оценивается для каждой строки в результатах, и строки не смешиваются. Поскольку ячейка не может иметь два разных значения одновременно, в одной строке не может быть » A11 » и «Cll», поэтому ZAB_KOD = 'A11' AND ZAB_KOD = 'C11' мгновенное автоматическое указание означает, что строки не вернутся. Конечно, в вашей базе данных могут быть две разные строки с разными значениями:

 ID, ZAB_KOD  1, A11 --ZAB_KOD = 'A11' TRUE, ZAB_KOD = 'C11' FALSE 2, C11 --ZAB_KOD = 'A11' FALSE, ZAB_KOD = 'C11' TRUE  

Но когда вы ставите AND , тогда а TRUE AND FALSE есть FALSE ; оно должно быть TRUE OR FALSE , потому что это приводит к TRUE

 (ZAB_KOD = 'A11' OR ZAB_KOD = 'C11' OR ZAB_KOD = 'ZH1') and zab_hip = 1  

Вы также можете использовать оператор IN, который работает как серия операций ИЛИ

 ZAB_KOD IN ('A11', 'C11', 'ZH1') and zab_hip = 1  

Сноска:

Когда вы смешиваете ИЛИ и И в предложении WHERE, всегда используйте круглые скобки, чтобы было ясно, какие вещи сочетаются. Эти две вещи очень разные:

 (name = 'John' and age = 20) or city = 'Chicago' --all 20 year olds called John who live anywhere, plus everyone in Chicago regardless their name or age name = 'John' and (age = 20 or city = 'Chicago') --only 20 year old people called John who live anywhere, plus only people called John of any age who live in Chicago  --which of the two above, is this: name = 'John' and age = 20 or city = 'Chicago'  

Если вы не ставите скобки, вы должны знать правила приоритета, чтобы определить, какие данные будут возвращены; на практике это менее запутанно для всех заинтересованных сторон (вы прямо сейчас, вы через 6 месяцев, человек, который берет на себя вашу работу и т. Д.), Если вы четко заключаете в скобки