¿Puede el operador "IN" usar LIKE-wildcards (%) en Oracle?

He buscado esta pregunta y encontré una respuesta en MySQL, pero este es uno de esos incidentes donde la statement no puede cruzar a Oracle.

¿Puedo usar comodines en la statement "IN" de MySQL?
más o less resume mi pregunta y lo que me gustaría hacer, pero en Oracle

Me gustaría encontrar el equivalente legal de

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

Gracias por cualquier ayuda

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

Parece que también puedes usar expresiones regulares

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

No estoy seguro de lo bien que funcionará esto … ver aquí

Esto parece ajustarse a lo que estás buscando: https://forums.oracle.com/forums/thread.jspa?threadID=2140801

Básicamente, necesitarás usar expresiones regulares ya que parece que no hay nada incorporado en el oracle para esto.

Saqué el ejemplo del hilo y lo convertí para tus propósitos. Yo chupo en Regex, así que eso podría necesitar ajustes 🙂

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

No es el 100% de lo que estaba buscando, sino una forma de hacerlo de adentro hacia afuera:

 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> 

Algo enrevesado, pero:

 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; 

Esta era una solución para un problema único, pero podría ayudar a alguien. Básicamente, no hay una statement "in like" y no había forma de get un índice para los primeros caracteres de variable_n de la columna, así que hice esto para crear un "in like" dynamic y rápido para usar en SSRS.

El contenido de la list ('Hecho', 'Terminado excepto', 'En curso') puede ser variable.

El equivalente legal más cercano a la syntax ilegal mencionada en cuestión es:

 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 || '%' ) 

Tanto la respuesta de la mina como la de @ Sethionic hacen posible la list de patrones dinámicamente (simplemente eligiendo otra fuente que no sys.whatever tabla auxiliar sys.whatever ).

Tenga en count que si tuviéramos que search el patrón dentro de la cadena (en lugar de desde el principio) y la database contenida, por ejemplo, status = 'Done In Progress' , entonces mi solución (modificada like '%' || patterns.column_value || '%' ) todavía generaría una fila para el logging dado, mientras que la solución de @ Sethionic (modificada a otra unión auxiliar antes de a ) produciría múltiples filas para cada ocurrencia de patrón. Al no juzgar cuál es mejor, solo tenga en count las diferencias y elija cuál se adapta mejor a sus necesidades.