我有一個問題,因為我想選擇一些帶有 where 和 and 的 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=&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=&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;
如果我一一選擇,它會顯示我犯錯的結果
uj5u.com熱心網友回復:
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,那么 aTRUE AND FALSE是FALSE; 它必須是TRUE OR FALSE,因為這會導致TRUE
(ZAB_KOD = 'A11' OR ZAB_KOD = 'C11' OR ZAB_KOD = 'ZH1') and zab_hip = 1
您還可以使用 IN 運算子,它的作業方式類似于一系列 OR 操作
ZAB_KOD IN ('A11', 'C11', 'ZH1') and zab_hip = 1
腳注:
當你在 WHERE 子句中混合 OR 和 AND 時,總是使用括號來明確哪些東西放在一起。這兩件事是非常不同的:
(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 個月后的您,接替您作業的人等)都不會感到困惑
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/363134.html
標籤:sql
上一篇:從日期列計算前一個星期日的日期?
