[英]Counting NULL values in a case statement
我有以下SQL查詢:
SELECT jobs.ID, jobs.title,
SUM(CASE WHEN jobresponses.result = 'true' THEN 1 ELSE 0 END) as True,
SUM(CASE WHEN jobresponses.result = 'false' THEN 1 ELSE 0 END) as False,
SUM(CASE WHEN jobresponses.result != 'true' AND jobresponses.result != 'false' THEN 1 ELSE 0 END) as Incomplete
FROM jobresponses
JOIN jobs on jobresponses.jobId = jobs.ID
WHERE jobs.ID = 1
GROUP BY jobs.ID, jobs.title
第三種情況是表達與實踐計數值result
的NULL
,但為了安全起見(間''
, undefined
和NULL
),我想主要有包羅萬象的“其他”類型的字段。 但是,問題在於未對NULL值進行計數。 請參閱此 SQL Fiddle。
使用IS NULL
:
SELECT jobs.ID, jobs.title,
SUM(CASE WHEN jobresponses.result = 'true' THEN 1 ELSE 0 END) as True,
SUM(CASE WHEN jobresponses.result = 'false' THEN 1 ELSE 0 END) as False,
SUM(CASE WHEN jobresponses.result IS NULL -- detect NULL
OR jobresponses.result NOT IN ('true', 'false') -- other values
THEN 1 ELSE 0 END) as Incomplete
FROM jobresponses
JOIN jobs on jobresponses.jobId = jobs.ID
WHERE jobs.ID = 1
GROUP BY jobs.ID, jobs.title;
NULL = NULL
為NULL
,這既不是true也不是false。 如果您想捕獲不是'true'
或'false'
任何內容,則可以使用use
SUM(CASE WHEN (jobresponses.result = 'true' OR jobresponses.result = 'false') THEN 0 ELSE 1 END) as Incomplete
一種簡單的方法可以逆轉then
/ else
邏輯:
SELECT j.ID, j.title,
SUM(CASE WHEN jr.result = 'true' THEN 1 ELSE 0 END) as True,
SUM(CASE WHEN jr.result = 'false' THEN 1 ELSE 0 END) as False,
SUM(CASE WHEN jr.result IN ('true', 'false') THEN 0 ELSE 1 END) as Incomplete
FROM jobresponses jr JOIN
jobs j
ON jr.jobId = j.ID
WHERE j.ID = 1;
GROUP BY j.ID, j.title
您可以查詢如下:
SELECT jobs.ID, jobs.title,
SUM(CASE WHEN jobresponses.result = 'true' THEN 1 ELSE 0 END) as True,
SUM(CASE WHEN jobresponses.result = 'false' THEN 1 ELSE 0 END) as False,
SUM(CASE WHEN jobresponses.result is null or ltrim(rtrim(jobresponses)) = '' THEN 1 ELSE 0 END) as Incomplete
FROM jobresponses
JOIN jobs on jobresponses.jobId = jobs.ID
WHERE jobs.ID = 1
GROUP BY jobs.ID, jobs.title
不要使用ISNULL()。 它可以工作,但是它是T-SQL函數。 請改用COALESCE()。 它是多平台的。
SUM(CASE WHEN COALESCE(jobresponses.result,'') = 'true' THEN 1 ELSE 0 END) as True,
SUM(CASE WHEN COALESCE(jobresponses.result,'') = 'false' THEN 1 ELSE 0 END) as False,
SUM(CASE WHEN COALESCE(jobresponses.result,'') NOT IN ('true','false') THEN 1 ELSE 0 END) as Incomplete
另外, jobresponses.result
的唯一有效值jobresponses.result
應該為“ true”,“ false”或null? 如果是這樣,則最好將該字段設置為bit/Boolean
而不是varchar()
。 這將大大減少存儲需求,並且可以更輕松,更有效地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.