繁体   English   中英

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

[英]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%'

看来你也可以使用正则表达式

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

我不确定这会有多好......但请看这里

这似乎符合您的要求: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM