2013-09-27 122 views
2

考慮下表(快照):條件選擇語句

enter image description here

我想編寫一個查詢來從表中選擇行

  • 至少4爲例,其中7列值(VAL,EQ,EFF,...,SY)不爲NULL ..

任何想法該怎麼做?

+0

這不是太困難,但是,你有沒有嘗試過自己的東西? –

+0

那麼,我試圖調製一些邏輯,但我不知道如何將它們翻譯成查詢語言:也許檢查is.na()爲每個單元格,總結行,並檢查總和是否大於但我不確定如何將其作爲查詢編寫。 – Mayou

回答

5

沒有看中這裏,算了算,每列非空數:

SELECT * 
FROM Table1 
WHERE 
    IIF(VAL IS NULL, 0, 1) + 
    IIF(EQ IS NULL, 0, 1) + 
    IIF(EFF IS NULL, 0, 1) + 
    IIF(SIZE IS NULL, 0, 1) + 
    IIF(FSCR IS NULL, 0, 1) + 
    IIF(MSCR IS NULL, 0, 1) + 
    IIF(SY IS NULL, 0, 1) >= 4 

只注意到你標記的SQL服務器2005。 IIF是sql server 2012,但您可以替代CASE WHEN VAL IS NULL THEN 1 ELSE 0 END

+0

+1我現在知道'IIF'和'CASE'方法正是我如何做到的。 :) – Khan

1

由於值是數字或NULL你可以使用這個ISNUMERIC()

SELECT * 
FROM YourTable 
WHERE ISNUMERIC(VAL)+ISNUMERIC(EQ)+ISNUMERIC(EFF)+ISNUMERIC(SIZE) 
    +ISNUMERIC(FSCR)+ISNUMERIC(MSCR)+ISNUMERIC(SY) >= 4 
2

這個怎麼樣?打開你的列到「行」,並使用SQL來算不空:

select * 
from Table1 as t 
where 
    (
     select count(*) from (values 
      (t.VAL), (t.EQ), (t.EFF), (t.SIZE), (t.FSCR), (t.MSCR), (t.SY) 
     ) as a(val) where a.val is not null 
    ) >= 4 

我喜歡這個解決方案,因爲它是分裂的數據,從數據處理 - 你得到這個派生出來的「表值」後,你可以做anithing到它,並且很容易在將來改變邏輯。你可以總結,計算,做任何你想要的聚合。如果它是像case when t.VAL then ... end + ...,這樣的東西,那麼你必須多次更改邏輯。

例如,假設您希望總和大於2的所有非空元素。在此解決方案中,您只需將count更改爲sum,然後添加where子句即可。如果是iif(Val is null, 0, 1) +,首先必須考慮應該對此做些什麼,然後將項更改爲例如case when Val > 2 then Val else 0 end

sql fiddle demo