`COUNT` 不僅能數 `*`,還支援欄位、常數、變數、`DISTINCT` 修飾,且 `COUNT(欄位)` 會**忽略 NULL**。本文以範例表 `t_test`(含 `sql_variant` 欄位 a,b,c)示範各種用法與結果。
IF OBJECT_ID('t_test') > 0 DROP TABLE t_test;
CREATE TABLE t_test (a SQL_VARIANT, b SQL_VARIANT, c SQL_VARIANT);
INSERT INTO t_test VALUES (1, 1, 'a');
INSERT INTO t_test VALUES (1, GETDATE(), NULL);
INSERT INTO t_test VALUES ('a', NULL, 1);
INSERT INTO t_test VALUES (3, NULL, NULL);
INSERT INTO t_test VALUES (NULL, NULL, NULL);
資料內容:
| a | b | c |
|---|---|---|
| 1 | 1 | a |
| 1 | 2024-01-15... | NULL |
| a | NULL | 1 |
| 3 | NULL | NULL |
| NULL | NULL | NULL |
SELECT
COUNT(*) AS total_rows, -- 5
COUNT(NULLIF(1,1)) AS always_zero, -- 0 (NULLIF 回傳 NULL)
COUNT(a) AS cnt_a, -- 4 (a 非 NULL 4 列)
COUNT(b) AS cnt_b, -- 2
COUNT(DISTINCT a) AS distinct_a, -- 3 (1, 'a', 3)
COUNT(ISNULL(b,c)) AS cnt_b_or_c, -- 3 (b 或 c 非 NULL)
COUNT(COALESCE(a,b,c)) AS cnt_any, -- 4 (a/b/c 任一非 NULL)
COUNT(NULLIF(a,b)) AS cnt_a_ne_b, -- 4 (a<>b 者,NULLIF 回傳 a)
COUNT(NULLIF(ISNUMERIC(CAST(a AS VARCHAR(38))),0)) AS cnt_a_numeric -- 3 (a 為數值者)
FROM t_test;