Ответ 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%'
Я искал этот вопрос и нашел ответ в MySQL, но это один из тех инцидентов, в которых оператор не может перейти в Oracle.
Могу ли я использовать подстановочные знаки в "IN" Инструкция MySQL? в значительной степени суммирует мой вопрос и то, что я хотел бы сделать, но в Oracle
Я хотел бы найти юридический эквивалент
Select * from myTable m
where m.status not in ('Done%', 'Finished except%', 'In Progress%')
Спасибо за любую помощь
Select * from myTable m
where m.status not like 'Done%'
and m.status not like 'Finished except%'
and m.status not like 'In Progress%'
Кажется, вы тоже можете использовать regexp
WHERE NOT REGEXP_LIKE(field, '^Done|^Finished')
Я не уверен, насколько это будет хорошо, если... см. здесь
Это похоже на то, что вы ищете: 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^)')
Не 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>
Немного запутанный, но:
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.
Содержимое списка ( "Готово", "Готово, кроме", "В процессе" ) может быть переменной.
Ближайшим юридическим эквивалентом незаконного синтаксиса, о котором идет речь, является:
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
) создаст несколько строк для каждого появления шаблона.
Не судя, что лучше, просто знайте различия и выбирайте, что лучше подходит вам.