【发布时间】:2019-08-20 06:26:37
【问题描述】:
如何在 Sql Server 中获得 3 个值中的最低值?
MySQL 中的同一个函数称为 LEAST,SQL Server 中的比较?
【问题讨论】:
标签: sql sql-server tsql
如何在 Sql Server 中获得 3 个值中的最低值?
MySQL 中的同一个函数称为 LEAST,SQL Server 中的比较?
【问题讨论】:
标签: sql sql-server tsql
你可以在没有嵌套的情况下做到这一点:
select (case when val1 < val2 and val1 < val3 then val1
when val2 < val3 then val2
else val3
end) as least_of_three
这似乎很清楚它在做什么。它也很容易概括。
请注意 NULL —— LEAST 和 GREATEST 会忽略它。如果你需要处理这些,那就有点麻烦了:
select (case when val1 <= coalesce(val2, val1) and val1 <= coalesce(val3, val1) then val1
when val2 <= coalesce(val3, val2) then val2
else val3
end) as least_of_three
请注意,我已将“
编辑:
我通常不会回去写七岁的问题的答案,但这个问题显然是SQL Server。最好的方法是使用apply:
select t.*, max_val
from t cross apply
(select max(v.val) as max_val
from (values (t.val1), (t.val2), . . .
) v(val);
请注意,此解决方案在 MySQL 中不起作用,因为它不支持横向连接。
【讨论】:
明显的嵌套 case 语句是:
select case when val1 < val2 then
case when val1 < val3 then val1
else val3
end
when val2 < val3 then val2
else val3
end
from cols;
在
create table cols (val1 int, val2 int, val3 int);
它不会很容易地扩展到更高的比较数,并且它不包括用于抑制空值的合并语句。
唯一的优势是其他程序员在查看您的代码时将能够快速弄清楚。 (除非这是性能瓶颈,否则我认为这是一个很好的考虑因素!)
【讨论】:
如果你想避免嵌套的 CASE 语句,这样就可以了(虽然有点尴尬):
CREATE TABLE #t(ID INT, V1 INT, V2 INT, V3 INT)
INSERT INTO #t VALUES
(1, 10, 20, 30)
, (2, 60, 50, 40)
SELECT * FROM #t t1
CROSS APPLY (SELECT MAX(V), MIN(V) FROM (
SELECT V1 AS V
UNION SELECT V2
UNION SELECT V3
) T) AS t2(VMAX, VMIN)
DROP TABLE #t
【讨论】:
UNION ALL 而不是UNION。使用UNION 将强制SQL Server 使用worktable。
SQL server中没有类似mysql中Least()函数的函数
MySQL 的 Least() 函数执行以下操作
取两个或多个参数,返回最小的(最小值) 争论。使用以下规则比较参数:
如果任何参数为 NULL,则结果为 NULL。无需比较。
如果在 INTEGER 上下文中使用返回值或所有参数都是 整数值,它们作为整数进行比较。
如果返回值用于 REAL 上下文或所有参数都是 实值,它们作为实数进行比较。
如果参数包含数字和字符串的混合,它们是 比较为数字。
如果任何参数是非二进制(字符)字符串,则参数是 比较为非二进制字符串。
在所有其他情况下,参数作为二进制字符串进行比较。
sql server的Min()函数返回表中某列的最小值 它不需要参数
这是一个模拟,但它仍然不像 Least,因为它只能接受整数
CREATE FUNCTION [dbo].[GetSmallest]
(
-- Add the parameters for the function here
@val1 int, @val2 int, @val3 int
)
RETURNS int
AS
BEGIN
Declare @result int
set @result = case when @val1 < @val2 then
case when @val1 < @val3 then
@val1
else
@val3
end
when @val2 < @val3 then
@val2
else
@val3
end
return @result
END
这是你的称呼
SELECT [dbo].[GetSmallest] ( 32 ,31 ,6)
【讨论】:
您可以在 T-SQL 中使用“Min”函数:
SELECT MIN(Value) FROM MyTable