sql >> Databáze >  >> RDS >> Oracle

Jaká je alternativa Find_in_set of mysql v Oracle

Nejedná se o přesnou alternativu k MySQL FIND_IN_SET , ale ve vašem příkladu (kde potřebujete vědět pouze POKUD je hodnota obsažena v sadě oddělené čárkami) Oracle REGEX_COUNT s regulárním výrazem '^([^,]+,)*your_value(,[^,]+)*$' bude sedět.

Prozkoumejte následující dotazy SQL (pro Oracle)...

Příklady s čísly

Vyhledejte číslo 1 v sadě:[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;

Vrátí 1 správně

Vyhledejte číslo 1 v souboru:[111 222 333]. INSTR by v tomto případě nevykazoval negativní výsledek.

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

Vrátí 0 správně

Příklady s řetězci

Vyhledejte 'John' v sadě jmen:

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;

Vrátí 1 správně

Ale pokud hledáte písmeno 'a' , správně vrátí nulu (INSTR by znovu selhal).

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;

Vrátí 0 správně

Vím, že tato otázka byla zodpovězena již dávno, ale ve výsledcích vyhledávání se řadí dobře a pravděpodobně by mohla pomoci ostatním, kteří hledají jednoduché, ale správnější řešení než INSTR společnosti Oracle. funkce.

Booleovské výrazy

Je také možné použít booleovské výrazy, jako je OR nebo AND .

Příklad pomocí OR je následující:

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;

Vrátí 1 správně, protože našel "peter" (hledejte buď "helen" nebo "petr" ).

Pro AND přístup je trochu jiný (upravuje výraz CASE místo regulárního výrazu ):

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;

Výše uvedený dotaz hledá oba "john" A "petr" . AND operaci lze snadno implementovat duplikováním REGEXP_COUNT výraz v CASE syntaxe, ale na oplátku s malou výkonnostní penalizací.



  1. Jak zřetězit dva řetězce během dotazu MySQL UPDATE?

  2. Je špatné používat uživatelské jméno jako primární klíč v návrhu databáze?

  3. MySQL GROUP BY...HAVING různé hodnoty stejné pole

  4. 4 Funkce pro vrácení měsíce z data v MariaDB