2016-03-01 87 views
0

我正試圖在Composer列中找到具有10個或更多具有NULL值的軌道的播放列表。SQL COUNT NULL值

下面是表

CREATE TABLE [Playlist] 
(
[PlaylistId] INTEGER NOT NULL, 
[Name] NVARCHAR(120), 
CONSTRAINT [PK_Playlist] PRIMARY KEY ([PlaylistId]) 
); 

CREATE TABLE [PlaylistTrack] 
(
[PlaylistId] INTEGER NOT NULL, 
[TrackId] INTEGER NOT NULL, 
CONSTRAINT [PK_PlaylistTrack] PRIMARY KEY ([PlaylistId], [TrackId]), 
FOREIGN KEY ([PlaylistId]) REFERENCES [Playlist] ([PlaylistId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION, 
FOREIGN KEY ([TrackId]) REFERENCES [Track] ([TrackId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION 
); 

CREATE TABLE [Track] 
(
[TrackId] INTEGER NOT NULL, 
[Name] NVARCHAR(200) NOT NULL, 
[AlbumId] INTEGER, 
[MediaTypeId] INTEGER NOT NULL, 
[GenreId] INTEGER, 
[Composer] NVARCHAR(220), 
[Milliseconds] INTEGER NOT NULL, 
[Bytes] INTEGER, 
[UnitPrice] NUMERIC(10,2) NOT NULL, 
CONSTRAINT [PK_Track] PRIMARY KEY ([TrackId]), 
FOREIGN KEY ([AlbumId]) REFERENCES [Album] ([AlbumId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION, 
FOREIGN KEY ([GenreId]) REFERENCES [Genre] ([GenreId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION, 
FOREIGN KEY ([MediaTypeId]) REFERENCES [MediaType] ([MediaTypeId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION 
) 

這是我到目前爲止所。我認爲查詢邏輯很好,但這是計數空值的正確方法嗎?

SELECT P.PlaylistId, P.name 
FROM Playlist P 
    JOIN PlaylistTrack pt ON p.PlaylistId = pt.PlaylistId 
    JOIN Track t ON pt.TrackId = t.TrackId 
GROUP BY p.PlaylistId 
HAVING COUNT(t.Composer IS NULL) >=10; 

回答

0

而不是NULL,你不能只是像<> 0?或= 0?

,或者至少嘗試:

凡T.Composer爲空或山坳= ''

或Where T.Composer ISNULL(COL, '')= ''

0

我會用左連接而不是內連接。這樣,即使該查詢中沒有行,它仍然會返回一行。有時候這有可能會打破你的陳述,因爲它不能計爲空。

1

試圖在SELECT子句中比較COUNT(T.Compser) >= 10是一個錯誤。這是一個將(總是)返回true/false的比較。該子查詢也與您的外部查詢無關。我真的很驚訝,它甚至沒有錯誤地運行。

您應該能夠使用HAVING子句,它是用來比較聚集:

SELECT 
    P.PlaylistID, 
    P.Name 
FROM 
    Playlist P 
INNER JOIN PlaylistTrack PT ON PT.PlaylistID = P.PlaylistID 
INNER JOIN Track T ON 
    T.TrackID = PT.TrackID AND 
    T.Composer IS NULL 
GROUP BY 
    P.PlaylistID, 
    P.Name 
HAVING 
    COUNT(*) >= 10 

編輯:你已經改變了你的問題。使用新的查詢,問題是COUNT()將始終計算一行,無論該值是什麼,除非該值爲NULLT.Composer IS NULL將評估爲值 - 無論是true還是false(1/0),這意味着無論T.Composer的值如何,每一行都將計入總計。