Подтвердить что ты не робот

Может ли оператор "IN" использовать LIKE-wildcards (%) в Oracle?

Я искал этот вопрос и нашел ответ в MySQL, но это один из тех инцидентов, в которых оператор не может перейти в Oracle.

Могу ли я использовать подстановочные знаки в "IN" Инструкция MySQL? в значительной степени суммирует мой вопрос и то, что я хотел бы сделать, но в Oracle

Я хотел бы найти юридический эквивалент

Select * from myTable m
where m.status not in ('Done%', 'Finished except%', 'In Progress%')

Спасибо за любую помощь

4b9b3361

Ответ 1

Select * from myTable m
where m.status not like 'Done%' 
and m.status not like 'Finished except%'
and m.status not like 'In Progress%'

Ответ 2

Кажется, вы тоже можете использовать regexp

WHERE NOT REGEXP_LIKE(field, '^Done|^Finished')

Я не уверен, насколько это будет хорошо, если... см. здесь

Ответ 3

Это похоже на то, что вы ищете: https://forums.oracle.com/forums/thread.jspa?threadID=2140801

В принципе, вам нужно будет использовать регулярные выражения, поскольку для этого не существует ничего встроенного в оракул.

Я вытащил пример из потока и преобразовал его для ваших целей. Я сосать в regex's, хотя, так что может потребоваться изменить:)

SELECT  *
FROM myTable m
WHERE NOT regexp_like(m.status,'((Done^|Finished except^|In Progress^)')

Ответ 4

Не 100% того, что вы искали, но своего рода наименьший способ сделать это:

SQL> CREATE TABLE mytable (id NUMBER, status VARCHAR2(50));

Table created.

SQL> INSERT INTO mytable VALUES (1,'Finished except pouring water on witch');

1 row created.

SQL> INSERT INTO mytable VALUES (2,'Finished except clicking ruby-slipper heels');

1 row created.

SQL> INSERT INTO mytable VALUES (3,'You shall (not?) pass');

1 row created.

SQL> INSERT INTO mytable VALUES (4,'Done');

1 row created.

SQL> INSERT INTO mytable VALUES (5,'Done with it.');

1 row created.

SQL> INSERT INTO mytable VALUES (6,'In Progress');

1 row created.

SQL> INSERT INTO mytable VALUES (7,'In progress, OK?');

1 row created.

SQL> INSERT INTO mytable VALUES (8,'In Progress Check Back In Three Days'' Time');

1 row created.

SQL> SELECT *
  2  FROM   mytable m
  3  WHERE  +1 NOT IN (INSTR(m.status,'Done')
  4            ,       INSTR(m.status,'Finished except')
  5            ,       INSTR(m.status,'In Progress'));

        ID STATUS
---------- --------------------------------------------------
         3 You shall (not?) pass
         7 In progress, OK?

SQL>

Ответ 5

Немного запутанный, но:

Select * from myTable m
join (SELECT a.COLUMN_VALUE || b.COLUMN_VALUE status
FROM   (TABLE(Sys.Dbms_Debug_Vc2coll('Done', 'Finished except', 'In Progress'))) a
JOIN (Select '%' COLUMN_VALUE from dual) b on 1=1) params
on params.status like m.status;

Это решение для очень уникальной проблемы, но это может помочь кому-то. По существу нет инструкции "in like", и не было никакого способа получить индекс для первых символов переменной переменной, поэтому я сделал это, чтобы сделать быструю динамику "как" для использования в SSRS.

Содержимое списка ( "Готово", "Готово, кроме", "В процессе" ) может быть переменной.

Ответ 6

Ближайшим юридическим эквивалентом незаконного синтаксиса, о котором идет речь, является:

select * from myTable m
where not exists (
  select 1
  from table(sys.ku$_vcnt('Done', 'Finished except', 'In Progress')) patterns
  where m.status like patterns.column_value || '%'
)

Как мой, так и @Sethionic ответ позволяют динамически отображать шаблоны (просто выбрав другой источник, чем auxiliar sys.whatever table).

Обратите внимание, что если бы нам пришлось искать шаблон внутри строки (а не с самого начала) и базы данных, содержащей, например, status = 'Done In Progress', тогда мое решение (измененное до like '%' || patterns.column_value || '%') все равно будет генерировать одну строку для данной записи, тогда как решение @Sethionic (модифицированное для другого вспомогательного соединения до a) создаст несколько строк для каждого появления шаблона. Не судя, что лучше, просто знайте различия и выбирайте, что лучше подходит вам.