Scalar Max dans Sql Server

Comment implémenter le MAX scalaire dans le server Sql (comme Math.Max). (En substance, je veux implémenter quelque chose comme Max (expression, 0), pour rendre les valeurs négatives remplacées par 0.)

J'ai vu dans d'autres discussions des solutions avec

  • créer une fonction scalaire (comment ça marche avec la performance?)
  • cas où expression> 0 THEN expression ELSE 0) (alors 'expression' est évaluée deux fois?)
  • utilisations compliquées de Max (agrégat).

Quel est le meilleur? Pourquoi Sql Server n'a-t-il pas quelque chose comme ça embedded? Des complications que je ne vois pas?

Dans tous les autres systèmes majeurs, cette fonction est appelée GREATEST .

SQL Server en manque sérieusement .

Vous pouvez faire un tas de déclarations de cas, ou utiliser quelque chose comme ceci:

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

Ce dernier est un peu less efficace que les instructions CASE .

vous voulez créer une fonction scalaire définie par l'user nommée MAX dans le server sql pour prendre deux parameters en input, une expression et une valeur min, et renvoyer l'expression si elle dépasse la valeur min, sinon returnner la valeur min?

Je ne m'inquiéterais pas de la performance des fonctions scalaires, laissez le server faire cela. J'utiliserais aussi IF au lieu de CAS pour tester la valeur> min.

Le server SQL n'a pas de fonction embeddede pour vous, car ils ne pensaient pas qu'il serait largement utilisé, je suppose.

L'optimiseur de requête doit empêcher le calcul de l'expression plusieurs fois.

Pour plus de lisibilité / maintenabilité, pensez à utiliser un CTE pour calculer l'expression avant l'instruction CASE.