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吗?谢谢你的回复!没有理由。我试过了,但运气不好,这就是我为什么要问的原因。你能把你试过的代码贴出来,至少让我们知道你想要什么方法吗?从你的样本数据中根本不清楚。