2017-10-20 63 views
0

Je travaille sur une logique pour les types d'ID il y a environ 20 d'entre eux et je fais cela IDType = COALESCE(1,2,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19)) sous clause where dans la requête.Limite des arguments sur la fonction Coalesce SQL?

1) Pour un enregistrement avec les types 1 et 12. Quand 1 est satisfait, 12 est ignoré et je ne vois qu'un seul résultat (évidemment deux avant).

2) Un enregistrement a le type ID 6,8,11. Et je m'attends à ce qu'il choisisse 6 et supprime 8 et 11 types selon l'ordre spécifié dans Coalesce mais cela ne fonctionne pas. Fait intéressant, je ne trouve aucun résultat pour cet enregistrement. Y a-t-il une limite au nombre d'arguments dans la fonction Coalesce? Dans le premier cas, elle prenait 1 et ignorait 12 et dans le second cas, elle n'attribuait aucun type d'ID. S'il vous plaît aider #NewToSQL

+0

Veuillez marquer votre rdbms (sql-server, oracle, postgres, etc) – Igor

+3

le résultat de COALESCE (1,2,4,5,6,7,8,9,10,11,12,13,15,16,17 , 18,19) est toujours 1. coalesce renvoie le premier non nul. – KeithL

Répondre

2

Si vous devez ramasser « premier » idtype vous pouvez le faire avec l'une des fonctions de la fenêtre, disent ROW_NUMBER

SELECT * FROM 
(
SELECT t.* , ROW_NUMBER() OVER (ORDER BY IDType) rn 
FROM table1 t 
WHERE IDType IN (1,2,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19) 
) a 
WHERE rn =1; 

Mise à jour pour ajouter partition by employee_id (tableau considéré champ employee_id)

SELECT * FROM 
(
SELECT t.* , ROW_NUMBER() OVER (PARTITION BY t.employee_id ORDER BY IDType) rn 
FROM table1 t 
WHERE IDType IN (1,2,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19) 
) a 
WHERE rn =1; 
+0

Ce que cela fait est de numéroter tous les types d'ID pour tous les enregistrements, mais en sélectionnant (évidemment) le numéro de ligne 1. Donc, s'il y a 10 employés avec 25 ID. il est numéroté de 1 à 25 pour l'ensemble de résultats et le numéro de ligne de filtrage 1 et en sortie 1 enregistrement. Ce que je veux, c'est renvoyer 10 employés mais avec un seul type d'ID (disons qu'ils ont tous 1 comme type d'ID ils retournent tous dans le jeu de résultats), correct? – Sanj

+0

@Sanj: Mise à jour. Je pense que vous auriez dû mentionner toutes les exigences dans la question, il est impossible de deviner ce dont vous avez besoin à moins de l'écrire. – a1ex07

+0

Votre réponse mise à jour était ce que je cherchais exactement, un bon apprentissage !! – Sanj

1

Dans SQL Server COALESCE n'a pas de limitation explicite sur la quantité sur les paramètres.

Votre lecture de votre problème ressemble à un problème logique, que vous devez résoudre en utilisant le Case (Transact-SQL).

COALESCE (Transact-SQL) est de résoudre les problèmes nuls.

+0

Peut-être avez-vous raison, j'utilise une mauvaise fonction. Quelle serait la meilleure approche dans mon cas quand je veux ignorer le reste des types d'ID quand on est disponible? dis deuxième cas où 6 est disponible et je veux ignorer 8 et 11 types. – Sanj

+0

@Sanj Pouvez-vous fournir une table qui affiche l'ID et le résultat attendu? Je ne peux pas trouver une bonne solution avec votre contribution. –