sql >> Databasteknik >  >> RDS >> Oracle

Vad är alternativet till Find_in_set av mysql i Oracle

Inte ett exakt alternativ till MySQL:s FIND_IN_SET , men i ditt exempelfall (där du bara behöver veta OM ett värde finns i en kommaseparerad uppsättning) Oracles REGEX_COUNT med regexet '^([^,]+,)*your_value(,[^,]+)*$' kommer att passa.

Undersök följande SQL-frågor (för Oracle)...

Exempel med siffror

Sök efter nummer 1 i uppsättningen:[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;

Returnerar 1 korrekt

Sök efter nummer 1 i uppsättningen:[111,222,333]. INSTR skulle inte rapportera negativt i detta fall.

SELECT
    CASE WHEN REGEXP_COUNT('111,222,333', '^([^,]+,)*1(,[^,]+)*$', 1, 'i') > 0
        THEN 1 ELSE 0
    END AS cnt
FROM DUAL;

Returnerar 0 korrekt

Exempel med strängar

Sök efter 'John' i en uppsättning namn:

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;

Returnerar 1 korrekt

Men om du söker efter bokstaven 'a' , returnerar den korrekt noll (INSTR skulle misslyckas igen).

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;

Returnerar 0 korrekt

Jag vet att den här frågan har besvarats för länge sedan, men den rankas bra i sökresultaten och kan förmodligen hjälpa andra som letar efter en enkel men mer korrekt lösning än Oracles INSTR funktion.

Booleska uttryck

Det är också möjligt att använda booleska uttryck, som OR eller OCH .

Ett exempel med OR är följande:

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;

Returnerar 1 korrekt, eftersom den hittade "peter" (sök antingen efter "helen" eller "peter" ).

För OCH tillvägagångssättet är lite annorlunda (ändrar CASE-uttrycket istället för 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;

Ovanstående fråga söker efter både "john" OCH "peter" . OCH operationen kan implementeras enkelt genom att duplicera REGEXP_COUNT uttryck i CASE syntax, dock i gengäld med en liten prestationsstraff.



  1. PHP-Mysql-tabellen går med från olika värdar

  2. Hur man listar alla vyer i Oracle Database

  3. Hur man infogar och hämtar en bild från PostgreSql med C#

  4. subsonic 2 går med i flera kolumner