Tsql 在SQL查询中选择实际最小值而不是NULL

Tsql 在SQL查询中选择实际最小值而不是NULL,tsql,null,min,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值并替换null 我想我可以将表连接到一个过滤版本,其中不显示空值。但这似乎有些过

从该表中:

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值并替换null

我想我可以将表连接到一个过滤版本,其中不显示空值。但这似乎有些过分。我认为这可以在minaggregate子句中实现

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

声明@null int

从tmp中选择@null=MINc

选择一个, B ISNULLc,@null作为val1 来自tmp

选择一个, B ISNULLc,从tmp中选择MINc作为val1
从tmp编辑:我写过你想要像ISNULLc,MINc这样的东西,但那是不可能的

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

我不想表达它,因为我想我可以将表连接到一个过滤版本,其中不显示空值,但或多或少您可以获得min并使用它

一次性:

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 

有什么原因不能直接使用COALESCE或ISNULL吗?谢谢你的回复!没有理由。我试过了,但运气不好,这就是我为什么要问的原因。你能把你试过的代码贴出来,至少让我们知道你想要什么方法吗?从你的样本数据中根本不清楚。