web-dev-qa-db-fra.com

Vérification de plusieurs colonnes pour une valeur

J'ai une table qui a des colonnes comme celle-ci par exemple:

id,col1,col2,col3,col4

Maintenant, je veux vérifier si ANY of col1, col2, col3, col4 ont la valeur passée.

Le long chemin à faire serait ..

SELECT * FROM table WHERE (col1 = 123 OR col2 = 123 OR col3 = 123 OR col4 = 123);

Je suppose que c'est la version opposée de IN.

Y a-t-il un moyen plus facile de faire ce que je veux?

38
Brett

Vous pouvez utiliser le prédicat IN, comme suit:

SELECT * FROM table WHERE 123 IN(col1, col2, col3, col4);

Démo SQL Fiddle


c'est la version opposée de IN.

Non, ce n'est pas, c'est comme si vous utilisiez la variable ORs comme vous l'avez fait dans votre question.


Pour clarifier ceci:

Le prédicat IN ou l’appartenance à un ensemble est défini comme suit:1:

enter image description here

Où le Value Expression peut être soit 2:

enter image description here

Donc, il est bon de le faire de cette façon, en utilisant la valeur expression 123, qui est un littéral.


1, 2: Images from: Requêtes SQL pour Mere Mortals (R): Guide pratique de manipulation des données en SQL

93
Mahmoud Gamal

Vous pouvez faire quelque chose comme: (Remarque: en supposant que les colonnes sont des valeurs numériques. Et, si la valeur concaténée crée la séquence de caractères que vous recherchez, utilisez un délimiteur pour distinguer les valeurs des colonnes. Pipe (|) est le délimiteur utilisé Exemple.)

SELECT [ID]
    ,[Col1]
    ,[Col2]
    ,[Col3]
    ,[Col4]
FROM [Table1]
WHERE '123' IN (
    CAST([Col1] AS VARCHAR) + '|'
    + CAST([Col2] AS VARCHAR) + '|'
    + CAST([Col3] AS VARCHAR) + '|'
    + CAST([Col4] AS VARCHAR) + '|'
)
2
Dionicio Gonzalez

J'ai eu un problème similaire et résolu de cette façon: SELECT * FROM table WHERE col1 OR col2 IN(SELECT xid FROM tablex WHERE somecol = 3)

Je ne sais pas si c'est "le meilleur moyen" mais cela fonctionne pour moi. 

Pensées?

1
Milk Man