2008-09-26 117 views
4

所有值我有一個表table1的列ID1,ID2,ID3中的所有列可以爲空選擇查詢在SQL +列

我可以行進入空或值的所有列。

我的問題是我需要選擇所有列值不應爲空的行。

感謝


有在表中完全大約300列。我無法爲where條件中的所有列執行is null屬性。

+0

這個問題沒有意義。你能說清楚嗎? – James 2008-09-26 08:23:37

回答

2

你需要這樣做:

SELECT * 
FROM yourtable 
WHERE 
    column1 IS NOT NULL 
AND column2 IS NOT NULL 
AND column3 IS NOT NULL 
AND .... 
3

使用「函數」來測試空值的答案是正確的。語法取決於數據庫。如果ISNULL()不存在於數據庫中,然後嘗試:

SELECT * FROM表1 WHERE ID1 IS NOT NULL和ID2 IS NOT NULL和ID3 IS NOT NULL

而且沒有辦法短下來,甚至如果你的桌子上有300個字段。

1

你是說你想選擇沒有列爲空的行嗎?

 
SELECT id1, id2, id3 
FROM Table1 
WHERE id1 IS NOT NULL AND id2 IS NOT NULL AND id3 IS NOT NULL 

2

最好的辦法是,要麼重新考慮你的表的設計,如果需要,分裂他們。

否則,最好的辦法就是逐步實現 - 獲取表元數據,通過列進行迭代,然後從那裏進行SQL創建。大多數編碼語言都可以訪問表元數據,如果不需要第二個SQL的話。

但是,最好的辦法是思考如何更好地設計表格。

0

您可以嘗試CLR存儲過程(如果您使用的是SQL Server)或使用C#或您正在使用的任何語言將此邏輯移動到應用程序的其他層。

另一種選擇是動態創建查詢,連接您的WHERE子句並執行您的動態生成的查詢。

3

不明白爲什麼這個問題會得到否定性的評論 - 這個問題可以擴展到從社區中的非程序員繼承大表的人(我從以前的經驗中知道),同樣,如果表是未知。降級這個,因爲它的'300'欄是沒有意義的國際海事組織。

+0

同意 - 但也許'balaweblog的評論/迴應是令人討厭的人。 我曾經繼承過一張這樣的表格(幸虧不是300列),並且沒有結束頭痛。他有我的同情心! – robsoft 2008-09-26 08:51:01

0

您剛剛讀取數據,還是想嘗試更新有問題的行?

我只是想知道是否有什麼你可以通過製作六個視圖,每個基於說50列不是NULL,然後將它們與某種EXISTS或UNION語句鏈接?

你能告訴我們更多關於你想要對你的結果集做什麼的嗎?

1

對不起 - 我可能是有點厚在這裏。你試圖找回在其中一列中有SOMETHING的行(除了id列)?

你不行;

 
create vw_View_Fields1to5 as 
    select id from employees 
    where name is not null or description is not null or field3 is not null 
    or field4 is not null or field5 is not null; 
create vw_View_Fields6to10 as 
    select id from employees 
    where field6 is not null or field7 is not null or field8 is not null 
    or field 9 is not null or field10 is not null; 
(etc) 

select id from vw_View_Fields1to5 
union 
select id from vw_View_Fields6to10 .... (etc) 

當然,您必須採用DISTINCT或其他功能來削減掉多個視圖中的行。

如果你想什麼都沒有比ID以外的任意列排之後,你會切換「或胡說不爲空」是「和等等爲空」(等)。

這是有道理的......還是我錯過了什麼? :-)

編輯:其實,我相信UNION過程只會帶回不同的行反正(而不是UNION ALL),但我可能是錯的 - 我沒有實際嘗試過....(但!)

0

無論是Georgi還是英格拉姆還是robsoft都是第一次。但是對於後續的東西,如果可能的話,可以改變表格並添加一個名爲CSELECTFLAG的列,並且最初將其更新爲Y,其中包含值爲N的所有列和其他列爲N的列。每次有一個插件需要更新。這將有助於使您的後續查詢更快更輕鬆。