SQL 服务器:在 CASE 表达式后排除具有 NULL 值的行
SQL Server : exclude rows with NULL values after CASE expression
下面的查询以我想要的方式从日志 table 中聚合数据...
SELECT
[TransactionNumber]
,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start'
,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end'
FROM [ILLData].[dbo].[History]
GROUP BY [TransactionNumber]
/*
227882 2015-09-29 14:17:07.443 2015-09-29 15:27:03.180
227883 NULL NULL
227884 2015-09-29 14:29:22.340 NULL
227885 NULL 2015-09-29 14:59:54.677
*/
...但我想排除任何包含 NULL 值的结果行。我尝试了下面的查询,但我一直得到相同的结果,并且不排除具有 NULL 值的行。
SELECT
[TransactionNumber]
,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start'
,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end'
FROM
[ILLData].[dbo].[History]
WHERE
'start' IS NOT NULL
AND 'end' IS NOT NULL
GROUP BY
[TransactionNumber]
/* still get rows with NULL values */
SELECT
[TransactionNumber]
,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start'
,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end'
FROM
[ILLData].[dbo].[History]
GROUP BY
[TransactionNumber]
HAVING
'start' IS NOT NULL
AND 'end' IS NOT NULL
/* still get rows with NULL values */
WITH history AS
(
SELECT
[TransactionNumber]
,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start'
,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end'
FROM
[ILLData].[dbo].[History]
GROUP BY
[TransactionNumber])
SELECT *
FROM history
WHERE 'start' IS NOT NULL
AND 'end' IS NOT NULL
/* still get rows with NULL values */
有没有办法过滤我使用 CASE
的查询结果?
问题出在您的字段名称上,因为 'start' 永远不会为 null,因为 SQL 将文本值与 null 进行比较。稍作改动,您的查询就可以了。
SELECT *
FROM
(SELECT
[TransactionNumber]
,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS [start]
,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS [end]
FROM [ILLData].[dbo].[History]
GROUP BY [TransactionNumber]) x
WHERE [start] IS NOT NULL
AND [end] IS NOT NULL
下面的查询以我想要的方式从日志 table 中聚合数据...
SELECT
[TransactionNumber]
,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start'
,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end'
FROM [ILLData].[dbo].[History]
GROUP BY [TransactionNumber]
/*
227882 2015-09-29 14:17:07.443 2015-09-29 15:27:03.180
227883 NULL NULL
227884 2015-09-29 14:29:22.340 NULL
227885 NULL 2015-09-29 14:59:54.677
*/
...但我想排除任何包含 NULL 值的结果行。我尝试了下面的查询,但我一直得到相同的结果,并且不排除具有 NULL 值的行。
SELECT
[TransactionNumber]
,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start'
,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end'
FROM
[ILLData].[dbo].[History]
WHERE
'start' IS NOT NULL
AND 'end' IS NOT NULL
GROUP BY
[TransactionNumber]
/* still get rows with NULL values */
SELECT
[TransactionNumber]
,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start'
,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end'
FROM
[ILLData].[dbo].[History]
GROUP BY
[TransactionNumber]
HAVING
'start' IS NOT NULL
AND 'end' IS NOT NULL
/* still get rows with NULL values */
WITH history AS
(
SELECT
[TransactionNumber]
,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS 'start'
,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS 'end'
FROM
[ILLData].[dbo].[History]
GROUP BY
[TransactionNumber])
SELECT *
FROM history
WHERE 'start' IS NOT NULL
AND 'end' IS NOT NULL
/* still get rows with NULL values */
有没有办法过滤我使用 CASE
的查询结果?
问题出在您的字段名称上,因为 'start' 永远不会为 null,因为 SQL 将文本值与 null 进行比较。稍作改动,您的查询就可以了。
SELECT *
FROM
(SELECT
[TransactionNumber]
,MIN(CASE WHEN [Entry] = 'Updated status to Awaiting OCLC Sending' THEN [DateTime] END) AS [start]
,MAX(CASE WHEN [Entry] = 'Updated Status to: Delivered to Web' THEN [DateTime] END) AS [end]
FROM [ILLData].[dbo].[History]
GROUP BY [TransactionNumber]) x
WHERE [start] IS NOT NULL
AND [end] IS NOT NULL