web-dev-qa-db-fra.com

CHOISIR O IN DANS - mySQL

disons que j'ai le tableau suivant:

 ID, Name 
 1, John 
 2, Jim 
 3, Steve 
 4, Tom

J'exécute la requête suivante

SELECT Id FROM Table WHERE NAME IN ('John', 'Jim', 'Bill');

Je veux obtenir quelque chose comme:

ID
1
2
NULL or 0

C'est possible?

11
vshale

Commencez par créer une sous-requête de noms que vous recherchez, puis joignez à gauche la sous-requête à votre table:

SELECT myTable.ID
FROM (
  SELECT 'John' AS Name
  UNION SELECT 'Jim'
  UNION SELECT 'Bill'
) NameList
LEFT JOIN myTable ON NameList.Name = myTable.Name

Cela renverra null pour chaque nom introuvable. Pour retourner un zéro à la place, il suffit de lancer la requête avec SELECT COALESCE(myTable.ID, 0) au lieu de SELECT myTable.ID.

Il y a un SQL Fiddle ici .

5
Ed Gibbs

Que dis-tu de ça?

SELECT Id FROM Table WHERE NAME IN ('John', 'Jim', 'Bill')
   UNION
SELECT null;
4
ChaiNavawongse

La question est un peu déroutante. "IN" est un opérateur valide en SQL et cela signifie une correspondance avec l'une des valeurs (voir ici ):

SELECT Id FROM Table WHERE NAME IN ('John', 'Jim', 'Bill');

Est le même que:

SELECT Id FROM Table WHERE NAME = 'John' OR NAME = 'Jim' OR NAME = 'Bill';

Dans votre réponse, vous semblez vouloir les réponses pour chacune des valeurs, dans l'ordre. Ceci est accompli en joignant les résultats avec UNION ALL (seul UNION élimine les doublons et peut changer l'ordre):

SELECT max(Id) FROM Table WHERE NAME = 'John' UNION ALL
SELECT max(Id) FROM Table WHERE NAME = 'Jim' UNION ALL
SELECT max(Id) FROM Table WHERE NAME = 'Bill';

Ce qui précède renverra 1 Id (le maximum) s'il y a des correspondances et NULL s'il n'y en a pas (par exemple pour Bill). Notez qu'en général, vous pouvez avoir plus d'une ligne correspondant à certains des noms de votre liste, j'ai utilisé "max" pour en sélectionner un, il vaut peut-être mieux garder la boucle sur les valeurs en dehors de la requête ou utiliser le (ID , Name) dans une jointure avec d'autres tables de votre base de données, au lieu de faire la liste des ID et de les utiliser.

1
marco