Oracle
 sql >> база данни >  >> RDS >> Oracle

Каква е алтернативата на Find_in_set на mysql в Oracle

Не е точна алтернатива на <на MySQL код>FIND_IN_SET , но във вашия примерен случай (където трябва да знаете само АКО дадена стойност се съдържа в набор, разделен със запетая) REGEX_COUNT с регулярния израз '^([^,]+,)*your_value(,[^,]+)*$' ще пасне.

Разгледайте следните SQL заявки (за Oracle)...

Примери с числа

Потърсете номер 1 в комплекта:[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;

Връща 1 правилно

Потърсете номер 1 в комплекта:[111,222,333]. INSTR няма да успее да докладва отрицателно в този случай.

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

Връща 0 правилно

Примери с низове

Потърсете 'John' в набор от имена:

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;

Връща 1 правилно

Но ако търсите буква 'a' , ще върне правилно нула (INSTR отново ще се провали).

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;

Връща 0 правилно

Знам, че на този въпрос е отговорено отдавна, но той се класира добре в резултатите от търсенето и вероятно може да помогне на други, които търсят просто, но по-правилно решение от INSTR на Oracle функция.

Булеви изрази

Възможно е също да използвате булеви изрази, като OR или И .

Пример за използване на OR е следното:

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;

Връща 1 правилно, тъй като намери "peter" (потърсете или "helen" или "петър" ).

За И подходът е малко по-различен (променя CASE израза вместо регулярния израз ):

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;

Горната заявка търси както "john" И "петър" . И операцията може да се приложи лесно чрез дублиране на REGEXP_COUNT израз в CASE синтаксис, но в замяна с малка грешка в производителността.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Сравняване с дата в Oracle sql

  2. SQL Server еквивалент на Bulk Collect в Oracle

  3. Потребителят на схемата на Oracle не може да създаде таблица в процедура

  4. промяна на размера на колоната в таблицата, съдържаща данни

  5. Oracle XML:Пропускане Не съществува възел