2012-03-02 15 views
22

He buscado esta pregunta y encontré una respuesta en MySQL, pero este es uno de esos incidentes donde la declaración no puede cruzar a Oracle.¿Puede el operador "IN" usar LIKE-wildcards (%) en Oracle?

Can I use wildcards in "IN" MySQL statement?
resume bastante bien 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

Respuesta

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

Estaba tratando de evitar la ruta larga, pero parece que podría ser la única forma – Matt

+0

@Matt Si esto solo se trata de escribir texto SQL ligeramente más corto, simplemente use la sintaxis propuesta en esta respuesta y aprenda en vivo con ella . Si esto se trata de tener LIKE filas de otra tabla (por lo que no puedes construir la lista de valores de antemano), este es un problema completamente diferente, que requeriría algo como: 'UNIR OTROS_TABLE EN NO (YOUR_TABLE.FIELD LIKE OTHER_TABLE .FIELD) '... –

+0

Terminé usando esto por simplicidad, pero las respuestas de expresiones regulares fueron útiles como una oportunidad para aprender un poco de Oracle. Gracias a todos – Matt

4

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

Básicamente, tendrá que usar expresiones regulares ya que parece que no hay nada incorporado en Oracle para esto.

Saqué el ejemplo del hilo y lo convertí para sus propósitos. Soy muy malo en de expresiones regulares, aunque, por lo que podrían necesitar ajustado :)

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

Parece que puede utilizar expresiones regulares demasiado

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

No estoy seguro de lo bien que se realice sin embargo. .. ver here

3

No es 100% lo que estaba buscando, pero la clase de una forma de adentro hacia afuera de hacerlo:

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> 
1

algo complicado, 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 muy singular, pero podría ayudar a alguien. Básicamente, no hay una declaración "in like" y no había forma de obtener un índice para los primeros caracteres de variable_n de la columna, así que hice esto para crear un "in like" dinámico y rápido para usar en SSRS.

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

+0

Esta es una respuesta muy valiosa, ya que se adapta bien a múltiples patrones. Mi caso de uso era buscar dentro de la cadena, así que lancé una solución similar pero un poco simplificada en mi propia respuesta. –

0

El equivalente más cercano a la sintaxis ilegal legal mencionado en la pregunta 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 mía y la respuesta de @ Sethionic hacen posible enumerar los patrones de forma dinámica (solo por elegir otra fuente de auxiliar sys.whatever tabla).

Nota, si tuviéramos que el patrón buscar dentro cadena (en lugar de desde el principio) y base de datos contenida, por ejemplo status = 'Done In Progress', a continuación, mi solución (modificado para like '%' || patterns.column_value || '%') aún generará una fila de registro dado, whileas la solución de @ Sethionic (modificada a otra unión auxiliar antes del a) produciría múltiples filas para cada ocurrencia del patrón. Sin juzgar cuál es mejor, solo tenga en cuenta las diferencias y elija cuál se adapta mejor a sus necesidades.

Cuestiones relacionadas