wake-up-neo.net

Mehrere Spalten auf einen Wert prüfen

Ich habe eine Tabelle, die beispielsweise solche Spalten hat:

id,col1,col2,col3,col4

Nun möchte ich überprüfen, ob ANY von col1, col2, col3, col4 den übergebenen Wert hat.

Der lange Weg dazu wäre ..

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

Ich denke, es ist die entgegengesetzte Version von IN.

Gibt es eine einfachere Möglichkeit, das zu tun, was ich will?

38
Brett

Sie können das Prädikat IN wie folgt verwenden:

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

SQL Fiddle Demo


es ist die entgegengesetzte Version von IN.

Nein, es ist nicht. Es ist dasselbe wie wenn Sie ORs verwenden, wie Sie es in Ihrer Frage getan haben.


Um dies zu verdeutlichen:

Das Prädikat IN oder die Setmitgliedschaft ist definiert als1:

enter image description here

Wo kann der Value Expression sein 2:

enter image description here

Daher ist es in Ordnung, dies mit dem Wertausdruck 123 zu tun, der ein Literal ist.


1, 2: Bilder von: SQL-Abfragen für Sterbliche (R): Eine praktische Anleitung zur Datenmanipulation in SQL

93
Mahmoud Gamal

Sie können beispielsweise Folgendes tun: (Hinweis: Angenommen, die Spalten sind numerische Werte. Wenn der verkettete Wert nur die gewünschte Zeichenfolge erstellt, verwenden Sie ein Trennzeichen, um die Spaltenwerte zu unterscheiden. Pipe (|) ist hier das Trennzeichen Beispiel.)

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

Ich hatte ein ähnliches Problem und habe es auf diese Weise gelöst: SELECT * FROM table WHERE col1 OR col2 IN(SELECT xid FROM tablex WHERE somecol = 3)

Ich bin nicht sicher, ob es "der beste Weg" ist, aber es funktioniert für mich. 

Gedanken?

1
Milk Man