En examinant cette question, il semble que ce soit beaucoup de travail qui ne devrait pas être nécessaire. Ils essaient d'étendre une plage avec une date. Dans d'autres bases de données, vous utiliseriez simplement greatest
et least
..
least(extendDate,min), greatest(extendDate,max)
Quand j'essaie de les utiliser, je reçois
'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.
Cela couvrirait l'extension dans les deux sens.
Aux fins de la question, vous devrez toujours effectuer un remplacement de gamme exclusif.
Je me demande simplement comment les utilisateurs de SQL Server implémentent des modèles de requête pour imiter least
et greatest
fonctionner.
- PostgreSQL
GREATEST
/LEAST
- MySQL
GREATEST
/LEAST
- MariaDB
GREATEST
LEAST
- DB2
GREATEST
LEAST
- Oracle
GREATEST
LEAST
Déroulez-vous les conditions dans des CASE
instructions ou existe-t-il une extension, un module complémentaire tiers ou une licence de Microsoft qui active cette fonctionnalité?
sql-server
t-sql
feature-comparison
Evan Carroll
la source
la source
LEAST
/GREATEST
- presque tous les concurrents SGBDR ont au moins des équivalents. La seule exception que j'ai pu trouver est Sybase, mais cela a également été interrompu pendant de nombreuses années à ce stade.Réponses:
Une méthode courante consiste à utiliser la
VALUES
clause etCROSS APPLY
les deux colonnes aliasées comme une seule colonne, puis à obtenir leMIN
etMAX
de chacun.Il existe d'autres façons de l'écrire, par exemple en utilisant
UNION ALL
Cependant, les plans de requête résultants semblent être les mêmes.
la source
Vous pouvez également mettre les valeurs en ligne dans une sous-requête. Comme ça:
la source
Ce serait un bon début -
la source
MOINS équivalent:
PLUS GRAND équivalent:
la source
least(5,6,7,8,9)
?Je crée des fonctions définies par l'utilisateur, par exemple
Bien qu'elle puisse fonctionner dans des cas simples, cette approche présente cependant plusieurs problèmes:
least
opérateur dans Oracle et MySQL, mais diffère de Postgres. Mais ce blindage contre null le rend plus verbeux (si vous savez qu'ils ne seront pas nuls, une plainecase when @a <= @b then @a else @b end
fonctionnerait).Dans l'ensemble, il peut être préférable de rédiger la
case
déclaration à la main si les performances sont importantes. J'ai même eu recours à la génération d'case
instructions imbriquées côté client lorsqu'il y a plusieurs valeurs à comparer.la source
J'avais l'intention d'ajouter un commentaire à la réponse @ ed-avis, mais je n'ai pas pu le faire, en raison du manque de réputation, alors je poste ceci en tant qu'extension à sa réponse.
J'ai éliminé l'inconvénient de "Vous devez créer des fonctions distinctes pour chaque type de données." Utilisation de SQL_VARIANT .
Voici ma mise en œuvre:
Cette fonction gère également les valeurs NULL comme la version postgresql.
Cette fonction pourrait être ajoutée à DB pour plus de commodité, mais elle est 10 fois plus lente que l'utilisation intégrée
IIF
. Mes tests montrent que cette fonction de type exact ( datetime ) fonctionne de la même manière que la version sql_variant .PS J'exécute quelques tests sur un ensemble de données de 350k valeurs, et il semble que les performances soient les mêmes, sql_variant est un peu plus rapide, mais je crois que ce n'est que de la frousse.
Mais de toute façon la version IIF est 10 fois plus rapide !!!
Je n'ai pas testé en ligne
CASE WHEN
mais fondamentalement pour t-sql IIF est identique à case , et iif get est converti par l'optimiseur en expression case.CONCLUSION: Il est plus rapide d'utiliser IIF si les performances sont importantes, mais pour le prototypage, ou si la clarté du code est plus nécessaire, et qu'aucun calcul important n'est impliqué, à condition que la fonction puisse être utilisée.
la source
iif(a<b, a, b)
est 10 fois plus rapide que n'importe quelle fonction définie par l'utilisateur.IIF()
- est-elle plus rapide que l'utilisation d'uneCASE
expression? Mon point est que, puisque vous vous êtes donné la peine de tester les performances, vous devez tester toutes les méthodes / réponses suggérées.