[英]Can the “IN” operator use LIKE-wildcards (%) in Oracle?
我已经搜索了这个问题,并在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%'
这似乎符合您的要求: 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^)')
不是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”语句,并且没有办法获得列的第一个variable_n字符的索引,所以我这样做了一个快速动态“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的答案都可以动态列出模式(只需选择其他来源而不是辅助的sys.whatever
表)。
注意,如果我们必须在字符串内搜索模式(而不是从头开始)和包含的数据库例如status = 'Done In Progress'
,那么我的解决方案(修改为like '%' || patterns.column_value || '%'
)仍然会为给定记录生成一行,而@ Sethionic的解决方案(在a
之前修改为另一个辅助连接)将为每个模式出现产生多行。 不判断哪个更好,只要注意差异并选择哪个更符合您的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.