2011-12-21 61 views
8

是否有更簡潔的語法來檢查多列是否不爲空?我正在尋求簡化Oracle SQL語法 - 爲IS檢查多個列NOT NULL

weight IS NOT NULL AND 
weight_unit IS NOT NULL AND 
length IS NOT NULL AND 
width IS NOT NULL AND 
height IS NOT NULL AND 
dimensional_unit IS NOT NULL 

變成更短的東西。

使用Oracle,如果它是相關的。

+0

我很確定這是一個騙局,但我似乎無法找到它。 – JNK 2011-12-21 20:41:54

+3

如果這可能是你想避免的一個條件(即所有的空值),那麼我建議在表上添加NOT NULL約束,然後你的查詢永遠不需要檢查。 – DaveRlz 2011-12-21 22:03:26

+0

同意@DaveRlz:建議分別爲'ThingWeight'和'ThingSize'分別設置表格,這樣如果一個東西的重量是未知的/不適用的/ etc,那麼不要在ThingWeight表格中添加一行。 – onedaywhen 2011-12-22 10:03:08

回答

2

據我所知,沒有這樣的語法。

但是,如果所有的人都是數字,你可以使用這一招:

weight + weight_unit + length + width + height + dimensional_unit is not null 
+7

如果任何一列有索引,這將是一個壞主意,因爲它會阻止數據庫使用索引來回答查詢。最好堅持與。 – 2011-12-21 20:59:38

+2

如果有人想把這個技巧轉換成連接varchar2或varchar列,id將不起作用。在Oracle中使用串聯。 'A ||如果B'爲空,則B'將是'A'。所以'C1 || C2 || C3 ||如果任何一列不爲空,C4'將不爲空。 – 2011-12-21 21:47:16

+2

@sacundim - 真的沒有問題。 6鏈'IS NOT NULL'條件不會對索引友好,但是你做它。 – 2011-12-21 21:49:49

13

隨着De Morgan's law

NOT(A或B)=(NOT A)和(非B)

您節省20個字符;)

NOT (
weight IS NULL OR 
weight_unit IS NULL OR 
length IS NULL OR 
width IS NULL OR 
height IS NULL OR 
dimensional_unit IS NULL 
) 
-1

如果要檢查所有的列是NOT NULL,那麼你可以先串聯的列,然後一次測試中進行IS NOT NULL如:

weight || weight_unit || length || width || height || dimensional_unit IS NOT NULL 

這將檢查是否所有的值一起跨越這些領域總共不會有NULL。

如果只是測試它們之間是否可能存在NULL,那麼我認爲您的問題的原始聲明仍然是最好的方式來做到這一點。

+1

他希望他們中的任何一個都是NULL。你寫的東西可以用COALESCE寫得更好(wheight,length,...)不爲空 – 2011-12-21 22:05:53

+0

道歉,相應更新 – 2011-12-21 22:13:21

+0

在Oracle中,如果任何值不爲null,修改後的答案將返回true,如果全部答案不爲空(例如''a'|| null ='a'')。 – Allan 2011-12-21 22:46:15

-2

這個怎麼樣..... COALESCE(字段1,字段2,...,字段N)不爲空

我認爲這將有助於爲目的!!!!

+2

它不會。如果AT至少有一列不爲空,問題是測試是否所有列都不爲空。 – 2015-01-21 10:27:00

-1

我想如果所有列/變量的類型數字或VARCHAR2的話,可以在SQL中使用下面的方法來解決這個問題, ,PL/SQL:

LENGTH(COL1||COL2||COL3) IS NOT NULL 

希望這會幫助你。

0
ALTER TABLE X 
    ADD CONSTRAINT C_X_NN 
     CHECK ( (
       DECODE (weight, NULL, 0, 1) + 
       DECODE (weight_unit, NULL, 0, 1) + 
       DECODE (length  , NULL, 0, 1) + 
       DECODE (width  , NULL, 0, 1) + 
       DECODE (height  , NULL, 0, 1) + 
       DECODE (dimensional_unit , NULL, 0, 1) 
       ) = 0 
      ); 
+1

也許你的代碼有一些解釋? – Rafalon 2017-07-14 22:02:01

+0

這是一個很好的解決方案,爲什麼downvotes? – Tobia 2017-11-30 12:23:21