我已经搜索了这个问题,并在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%')
感谢您的帮助
答案 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)
答案 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'
之前修改为另一个辅助连接)将为每个模式出现产生多行。
不判断哪个更好,只要注意差异并选择哪个更符合您的需求。