Keine exakte Alternative zu MySQLs FIND_IN_SET
, aber in Ihrem Beispielfall (wo Sie nur wissen müssen, ob ein Wert in einem durch Kommas getrennten Satz enthalten ist) Oracles REGEX_COUNT
mit dem Regex '^([^,]+,)*your_value(,[^,]+)*$'
passt.
Untersuchen Sie die folgenden SQL-Abfragen (für Oracle)...
Beispiele mit Zahlen
Suchen Sie nach der Nummer 1
im Satz:[1,2,3,4,5,6,11,12,13]
SELECT
CASE WHEN REGEXP_COUNT('1,2,3,4,5,6,11,12,13', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
Gibt 1
zurück richtig
Suchen Sie nach der Nummer 1
im Satz:[111.222.333]. INSTR würde in diesem Fall kein negatives Ergebnis melden.
SELECT
CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END AS cnt
FROM DUAL;
Gibt 0
zurück richtig
Beispiele mit Strings
Suchen Sie nach 'John'
in einer Reihe von Namen:
SELECT
CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*John(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
Gibt 1
zurück richtig
Aber wenn Sie nach dem Buchstaben 'a'
suchen , wird es korrekt Null zurückgeben (INSTR würde erneut fehlschlagen).
SELECT
CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*a(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
Gibt 0
zurück richtig
Ich weiß, dass diese Frage vor langer Zeit beantwortet wurde, aber sie rangiert gut in den Suchergebnissen und könnte wahrscheinlich anderen helfen, die nach einer einfachen, aber korrekteren Lösung als Oracles INSTR
suchen Funktion.
Boolesche Ausdrücke
Es ist auch möglich, boolesche Ausdrücke wie OR
zu verwenden oder AND
.
Ein Beispiel mit OR
lautet wie folgt:
SELECT
CASE WHEN REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*(helen|peter)(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
Gibt 1
zurück richtig, da es "peter" gefunden hat (suchen Sie entweder nach "helen" oder "peter" ).
Für AND
der Ansatz ist etwas anders (ergänzt den CASE-Ausdruck anstelle des regex ):
SELECT
CASE WHEN
REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*john(,[^,]+)*$', 1, 'i') > 0 AND
REGEXP_COUNT('john,peter,jim,kelly,laura,bill,tom,foo,bar', '^([^,]+,)*peter(,[^,]+)*$', 1, 'i') > 0
THEN 1 ELSE 0
END as cnt
FROM DUAL;
Die obige Abfrage sucht sowohl nach "john" UND "peter" . Das AND
Der Vorgang kann einfach durch Duplizieren des REGEXP_COUNT
implementiert werden Ausdruck im CASE
Syntax, jedoch im Gegenzug mit einer kleinen Leistungseinbuße.