在SQL SERVER中获取3个值中的较小值

14 浏览
0 Comments

在SQL SERVER中获取3个值中的较小值

在SQL Server中如何获得3个值中最小的值?

MySQL中具有相同功能的函数称为LEAST,而在SQL Server中的比较操作是什么?

0
0 Comments

问题:如何从三个值中获取最小值?

原因:在SQL SERVER中,如果需要从三个值中获取最小值,可以使用嵌套的CASE语句来实现。但是,使用嵌套的CASE语句在比较多个值时不太容易扩展,并且没有包含COALESCE语句来排除空值。另外,如果代码需要被其他程序员阅读,嵌套的CASE语句可能不太容易理解,而且遗留代码中的注释可能不可靠。

解决方法:可以使用嵌套的CASE语句来获取最小值,如上面提供的示例代码所示。但是,为了提高可读性和可维护性,建议在代码中添加有用的注释,以解释代码的意图和功能。此外,如果需要从多个值中获取最小值,并且担心性能问题,可以考虑使用其他更高效的方法来实现,例如使用MIN函数或使用ORDER BY和LIMIT子句。具体的解决方法可以根据实际需求和性能要求进行选择。

0
0 Comments

在SQL SERVER中,有一个问题是获取3个值中的最小值。下面是一些解决方法。

第一种方法是使用嵌套的case语句:

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函数会忽略它们。如果需要处理NULL值,就有点麻烦了:

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

注意我将"<"改为"<=",我使用coalesce函数来“忽略”值,使其计算结果为真。所以,如果val2为空,val1始终小于val2。我选择这种方法是因为它适用于所有数据类型(字符串、数字、日期)。

编辑:

虽然我通常不会在七年前的问题上写答案,但这个问题显然是关于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中不起作用,因为MySQL不支持LATERAL JOIN。

“很容易推广到更多的值”除了查询长度是O(N²)之外(笑)。

0
0 Comments

问题的出现原因是想要从三个值中获取最小值,但是避免使用嵌套的CASE语句。解决方法是使用CROSS APPLY和UNION ALL来实现。

在SQL Server中,可以使用CROSS APPLY和UNION ALL来获取三个值中的最小值。首先,创建一个临时表#t,并插入包含三个值的数据。然后使用CROSS APPLY子句来实现获取最小值的功能。在CROSS APPLY子句中,使用UNION ALL来将三个值合并为一个结果集,并使用MAX和MIN函数来获取最大值和最小值。最后,使用DROP TABLE语句删除临时表#t。

需要注意的是,在合并三个值时,应使用UNION ALL而不是UNION。使用UNION会强制SQL Server使用一个worktable。

以下是完整的SQL代码:

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

0