2017-02-23 1 views
1

Ich versuche, eine einfache Abfrage zu tun, die eine where-Klausel hat die besagt, es keine Übereinstimmung für 2 Einzelteile ist:mysql query nicht wie mehrere Text übereinstimmt

where l.country not like \"%USA%\" or \"%CA%\" ORDER BY l.state 

ich auch versucht:

where l.country not like \"%USA%\" or l.country not like \"%CA%\" ORDER BY l.state 

auch versucht:

where l.country not like (\"%USA%\", \"%CA%\") ORDER BY l.state 

gibt es eine Möglichkeit, "nicht wie" mit mehr als einer Übereinstimmung zu verwenden?

+0

Ja, aber es ist Regex-basierten langsameren Ansatz. Was ist los mit dem aktuellen – GurV

+1

Was ist deine Logik eigentlich? Möchten Sie Datensätze abgleichen, die nicht USA _und_ CA oder USA _or_ CA haben? –

Antwort

1

Das ist Ihr ursprünglicher Zustand:

where l.country not like "%USA%" or "%CA%" ORDER BY l.state 

Ich nehme an, Sie dies beabsichtigen, zu bedeuten, „das Land ist weder die USA noch CA.“

Wenn ja, würden Sie es auf diese Weise schreiben:

where l.country not like '%USA%' and l.country not like '%CA%' ORDER BY l.state 

Aber es gibt keine Syntax in SQL für NOT LIKE 'X' OR 'Y'. Das Prädikat LIKE hat einen linken Operanden und einen einzelnen rechten Operanden, nicht mehr.

Der Ausdruck, den Sie geschrieben haben, ist ein gültiger Ausdruck, tut aber nicht das, was Sie denken. Es ist wie, als ob Sie das geschrieben hatte:

where (l.country not like "%USA%") or ("%CA%") ORDER BY l.state 

Das heißt, zwei Begriffe, getrennt durch OR, die erste ist ein LIKE Vergleich, und das zweite ist nur eine einzige Stringliteral auf seine eigene. Das ist ein gültiger Ausdruck in einem Ausdruck, aber er macht nichts Sinnvolles. Es ist wie das Schreiben:

x = 6 * 8 + 0 

Welche Auswirkungen hat die Null in diesem Ausdruck? Keiner.


Update: Ich war falsch, übersah ich eine Wirkung der Abfrage, wie Sie es geschrieben haben. Sie sollten wissen, dass in einem booleschen Ausdruck, wenn Sie OR zwei Begriffe, es ist egal, was der erste Begriff ist, wenn der zweite Begriff immer TRUE ist.

WHERE (some expression) OR (TRUE) 

Dies ist immer wahr.

Die Literalzeichenfolge '%CA%' gilt als wahr, weil es keine leere Zeichenfolge oder ein NULL ist. In Ihrer ursprünglichen Abfrage ist die WHERE-Klausel also immer wahr, unabhängig vom Land.

+0

Danke für die Antwort und die klare Erklärung! – Sackling

1

Sie könnten REGEXP mit einem Wechsel verwenden:

SELECT * 
FROM yourTable 
WHERE country NOT REGEXP '"%USA%"|"%CA%"' 

Hinweise:

Sie benötigen keine doppelte Anführungszeichen zu entkommen, die innerhalb von Stringliterale in einfache Anführungszeichen erscheinen. Ihre ursprüngliche Abfrage würde nicht ausgeführt, denke ich, weil Sie eine Spalte mit LIKE gegen eine andere Spalte oder ein String-Literal, normalerweise in einfachen Anführungszeichen vergleichen müssen.

REGEXP ist nicht Groß-und Kleinschreibung, so könnten wir usa und ca für das gleiche Ergebnis verwendet haben, obwohl dies in Ihrem Fall keine Rolle spielt.