grimboite/old/2013-05-23 t-sql-hints.md

2.1 KiB

Title Tags Slug Date
Deux-trois trucs utiles en SQL sql, dev, hints tsql-hints 2013-05-23

Dans le dernier article, j'ai donné une manière d'implémenter un breadcrumb en SQL. Le truc que je n'avais pas vu venir, c'est que le champ pos est en fait incrémenté à chaque tour de boucle (normal, jusque là...). Du coup, le premier objet dans la liste a en fait la position la plus élevée. Dans l'absolu, ce n'est pas un gros problème, puisqu'il suffit de mettre une clause ORDER BY pos DESC pour se débarrasser du problème.

Ouimévoila: pour un cas pratique, j'ai dû trouver l'objet se trouvant en deuxième position dans cette liste, et vu que la liste est ordonnée de manière décroissante (le premier est dernier...), ... Bref, je me suis fait avoir.

=> Solution de derrière les fagots: soit modifier la vue créée précédemment pour qu'elle soit correctement triée, soit ajouter une sélection supplémentaire qui va d'abord trier la liste pour lui ajouter un numéro de ligne (en utilisant la fonction ROW_NUMBER() en SQL), puis choisir les lignes qui nous intéresse en fonction de ce numéro de ligne (en l'occurence, la deuxième pour moi :) )

Select Label From
	(Select Label, Row_number() OVER (ORDER BY pos DESC) as row_number
		From Breadcrumb(ID)) table0
WHERE table0.row_number = 2

Ce principe peut être étendu aux méthodes Skip() et Take() avec LINQ.

... Where table0.row_number Between x And y

Référence: StackOverflow

Une deuxième chose utile en SQL (T-SQL only?), c'est la fonction coalesce() qui permet de retourner la première valeur non nulle parmi l'ensemble des paramètres: Select coalesce(NULL, NULL, 'test1', 'test2') retournera la chaîne de caractères test1 alors que Select coalesce(NULL, NULL, NULL, 'test2') retournera test2. Combinée avec un ou plusieurs Select, cette fonction peut vous faire gagner pas mal de temps et éviter des jointures pour finalement vérifier la valeur des variables avec un CASE WHEN ... THEN ... ELSE ... END.