Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Was ist eine Alternative zu Find_in_set von mysql in Oracle

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.