10

How to implement the scalar MAX in Sql server (like Math.Max). (In essense I want to implement something like Max(expression, 0), to make negative values replaced by 0.)

I've seen in other threads solutions with

  • creating a scalar function (how's that with performance?)
  • case when expression > 0 THEN expression ELSE 0) (then 'expression' is evaluated twice?)
  • complicated uses of Max(aggregate).

What's the best? Why does Sql Server not have something like this built in? Any complications I don't see?

5

4 Answers 4

5

In all other major systems this function is called GREATEST.

SQL Server seriously lacks it.

You can make a bunch of case statements, or use something like this:

SELECT  (
        SELECT  MAX(expression)
        FROM    (
                SELECT  expression
                UNION ALL
                SELECT  0
                ) q
        ) AS greatest
FROM    table_that_has_a_field_named_expression

The latter one is a trifle less performant than CASE statements.

Sign up to request clarification or add additional context in comments.

7 Comments

This is great because if the first expression is a complicated calculation and you're comparing it to a constant, you only have to write the complicated calculation once!
In order to get this feature into the product please vote on the Microsoft Connect item: connect.microsoft.com/SQLServer/feedback/details/767183/…
Voted! This would definitely be a useful addition!
Hi! Do you know if this has since been added to SQL Server? I checked the MS Connect link but looks like they closed down Connect. Thx.
OK thanks, I checked some more as well, couldn't find anything. It's too bad because I think other RDBMS's have it.
|
3

As of Sql Server 2022, the GREATEST function is what you're looking for.

https://learn.microsoft.com/en-us/sql/t-sql/functions/logical-functions-greatest-transact-sql?view=azuresqldb-mi-current

SELECT GREATEST(expr1, expr2)

Comments

1

you want to create a user-defined scalar function named MAX in sql server to take two parameters as input, an expression and a min value, and return the expression if it exceeds the min value, otherwise return the min value?

I wouldn't worry about the performance of scalar functions, let the server do that. I'd also use IF instead of CASE to test for > min value.

SQL server doesn't have a built in function for you because they didn't think it would be widely enough used, I guess.

2 Comments

about the performance of scalar functions: they can be really painfull, but i think it is safe to assume that as long as there is no table/view logic involved, they should be quite fast (like built in system functions?) – Rein 0 secs ago
IF and CASE are different statement types. Whether you can use IF over CASE depends on where you want to use it.
0

The query optimizer should prevent the expression from being calculated multiple times.

For readability / maintainability, consider using a CTE to calculate the expression before the CASE statement.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.