【问题标题】:Getting lower value out of 3 values in SQL SERVER从 SQL SERVER 中的 3 个值中获取较低的值
【发布时间】:2019-08-20 06:26:37
【问题描述】:

如何在 Sql Server 中获得 3 个值中的最低值?

MySQL 中的同一个函数称为 LEAST,SQL Server 中的比较?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    你可以在没有嵌套的情况下做到这一点:

    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 中不起作用,因为它不支持横向连接。

    【讨论】:

    • “很容易概括”除了查询的 O(N 平方) 长度 lol
    【解决方案2】:

    明显的嵌套 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 语句(即使是“简单' 如果您不知道意图,可能会不清楚)。
    • @Pondlife 我经常使用遗留代码库。我无法告诉你有多少次我发现没有更改 cmets 的代码已更改。代码库越旧,我就越不信任 cmets。因此,解释某事的 cmets 越少越好。 YMMV
    【解决方案3】:

    如果你想避免嵌套的 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
    【解决方案4】:

    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)
    

    【讨论】:

      【解决方案5】:

      您可以在 T-SQL 中使用“Min”函数:

      SELECT MIN(Value) FROM MyTable
      
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 2014-05-15
      • 2018-02-02
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多