在SQL查询中选择实际的MIN值而不是NULL

时间:2014-03-07 19:48:20

标签: tsql null min

从此表中:

Select * into #tmp from (
select 'a' A, 'b' B, NULL C union all
select 'aa' A, 'ab' B, 1 C union all
select 'aaa' A, 'bbb' B, 2 C ) x

我想得到这个结果:

A   B   Val
a   b   1
aa  ab  1
aaa bbb 2

即,取非空的最小值并替换NULL。

我想我可以将表连接到自身的过滤版本,其中不会出现空值。但这似乎有点矫枉过正。我认为这可以在MIN Aggregate子句本身中完成。

任何想法都会有所帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

声明@null int

从#tmp

中选择@null = MIN(c)

选择A,     B,     ISNULL(c,@ null)为val1     来自#tmp

选择A,     B,     ISNULL(c,(从#tmp中选择MIN(c)))为val1     来自#tmp

答案 1 :(得分:-1)

编辑:我写道“你想要像ISNULL(c,MIN(c)这样的东西,但这是不可能的。”

但我错了,这是可能的。我在语法中遗漏了一些东西,所以@ kiki47的答案正是你所要求的。


我不会将其称为“我想我可以将表格加入到其中没有空值的过滤版本”,但是或多或少可以获得最小值并使用它。

一气呵成:

WITH cte AS (
  SELECT MIN(c) minVal FROM #tmp WHERE c IS NOT NULL
)
SELECT a, b, ISNULL(c, cte.minVal) 
  FROM #tmp 
 CROSS JOIN cte

或者可能更简单(但可以针对相同的事情进行优化):

DECLARE @minVal INTEGER
SELECT @minVal = MIN(c) FROM #tmp WHERE c IS NOT NULL
SELECT a, b, ISNULL(c, @minVal) FROM #tmp