Sql “我可以吗?”;在;运算符在Oracle中是否使用通配符(%)?
我搜索了这个问题,并在MySQL中找到了答案,但这是该语句无法转换到Oracle的事件之一Sql “我可以吗?”;在;运算符在Oracle中是否使用通配符(%)?,sql,oracle,where,wildcard,Sql,Oracle,Where,Wildcard,我搜索了这个问题,并在MySQL中找到了答案,但这是该语句无法转换到Oracle的事件之一 大致概括了我的问题和我想做的事情,但在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
大致概括了我的问题和我想做的事情,但在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%'
基本上,您需要使用正则表达式,因为oracle中似乎没有为此内置任何内容
我从线程中提取了示例,并根据您的目的对其进行了转换。不过,我在正则表达式方面很差劲,所以这可能需要调整:)
似乎您也可以使用regexp
WHERE NOT REGEXP_LIKE(字段“^Done”^Finished”)
但我不确定这会有多好。。。请看不是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”语句,也没有办法为列的第一个变量字符获取索引,所以我做了这个来创建一个快速动态的“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 || '%'
)
mine和@Sethionic的答案都使动态列出模式成为可能(只需选择辅助sys.which
table之外的其他源即可)
注意,如果我们必须搜索字符串内部的模式(而不是从开始)和包含的数据库,例如status='Done In Progress'
,那么
我的解决方案(修改为“%”| | patterns.column | value |‘%”)仍然会为给定记录生成一行,而
@Sethionic的解决方案(修改为a
之前的另一个辅助联接)将为每个模式出现生成多行。
不要判断哪一个更好,只需注意差异,选择更适合您的需要。我试图避免走漫长的路,但看起来这可能是唯一的选择way@Matt如果这只是关于编写稍微短一点的SQL文本,而不仅仅是使用这个答案中提出的语法,并学习如何使用它。如果这是一个类似于另一个表中的行的问题(因此您不能事先真正构造值列表),那么这是一个完全不同的问题,需要这样的东西:
在NOT上连接其他表(您的表字段类似于其他表字段)
…为了简单起见,我最终使用了这个,但是正则表达式的答案作为一个学习甲骨文新知识的机会是很有帮助的。谢谢,这是一个非常有价值的答案,因为它适合多种模式。我的用例是搜索字符串内部,所以我在自己的答案中使用了类似但稍微简化的解决方案。
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 || '%'
)