【问题标题】:SQL COUNT NULL valuesSQL COUNT NULL 值
【发布时间】:2016-03-01 21:30:37
【问题描述】:

我正在尝试查找包含 10 个或更多曲目且在 Composer 列中具有 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;

【问题讨论】:

    标签: sql tsql count null


    【解决方案1】:

    试图在SELECT 子句中比较COUNT(T.Compser) >= 10 是错误的。这是一个将(总是)返回真/假的比较。该子查询也与您的外部查询无关。我真的很惊讶它甚至没有错误地运行。

    您应该能够使用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 的值如何,每一行都将计入聚合。

    【讨论】:

      【解决方案2】:

      你不能只声明 0 之类的东西,而不是 NULL 吗?或 = 0 ?

      或者至少尝试一下:

      其中 T.Composer 为 NULL 或 col = ''

      或 Where T.Composer IsNull(col, '') = ''

      【讨论】:

        【解决方案3】:

        我会使用左连接而不是内连接。这样,即使该查询中没有行,它仍然会返回一行。有时这有可能破坏您的陈述,因为它不能算为空。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-15
          • 1970-01-01
          • 1970-01-01
          • 2020-08-31
          • 1970-01-01
          相关资源
          最近更新 更多