“IN”运算符可以在Oracle中使用LIKE通配符(%)吗?

时间:2012-03-02 20:43:47

标签: sql oracle where wildcard

我已经搜索了这个问题,并在MySQL中找到了答案,但这是该声明无法跨越Oracle的事件之一。

Can I use wildcards in "IN" MySQL statement?
几乎总结了我的问题以及我想做的事情,但在Oracle中

我想找到合法的

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

感谢您的帮助

6 个答案:

答案 0 :(得分: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%'

答案 1 :(得分:10)

似乎你也可以使用正则表达式

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

我不确定这会有多好......但请参阅here

答案 2 :(得分:4)

这似乎符合您的要求:https://forums.oracle.com/forums/thread.jspa?threadID=2140801

基本上,您需要使用正则表达式,因为oracle中似乎没有内置任何内容。

我从线程中提取了示例并将其转换为您的目的。我吮吸正则表达式,所以可能需要调整:)

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

答案 3 :(得分:3)

不是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>

答案 4 :(得分:1)

有点费解,但是:

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”语句,并且没有办法获得列的第一个variable_n字符的索引,所以我这样做了一个快速动态“in like”用于SSRS。

列表内容('完成','完成除','正在进行')可以是变量。

答案 5 :(得分:0)

与提及的非法语法最接近的法律等同词是:

Activity

我和@ Sethionic的答案都可以动态列出模式(只需选择辅助Fragment表之外的其他来源)。

注意,如果我们必须搜索里面的字符串(而不是从头开始)和包含例如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 || '%' ) 的数据库,那么 我的解决方案(修改为sys.whatever)仍然会为给定记录生成一行,而asas @ Sethionic的解决方案(在status = 'Done In Progress'之前修改为另一个辅助连接)将为每个模式出现产生多行。 不判断哪个更好,只要注意差异并选择哪个更符合您的需求。