Oracle-like 多条件过滤以及and or用法

1、select * from  file  where DOC_SUBJECT  not like '%测试%' and (DOC_STATUS like '待审' or DOC_STATUS like '结束' )  #过滤测试数据,并保留待审和结束数据。
<=>
select * from  LEAP.HMDW_DW_CZDS_YXHD_NEW  where DOC_SUBJECT  not like '%测试%' and DOC_STATUS not like '废弃' and DOC_STATUS not like '驳回' and DOC_STATUS not like '草稿'    #比较笨,而且,DOC_STATUS值有新增就会导致错误。

<=> select * from  file  where DOC_SUBJECT  not like '%测试%' and regexp_like(DOC_STATUS,'(待审|结束)')

PS:
(1)DOC_STATUS数值有:待审、结束、草稿、废弃、驳回。

(2)oracle 字段like多个条件(or关系)

写oracle sql时有时候会有 and (字段 like ‘匹配串1’or 字段 like ‘匹配串2’or ...)这样的情况出现,下面提供一个简洁点的解决方案--

<=>

and REGEXP_LIKE(字段, '(匹配串1|匹配串2|...)') //全模糊匹配      等价于上一行,行的通

and REGEXP_LIKE(字段, '^(匹配串1|匹配串2|...)') ";//右模糊匹配   

and REGEXP_LIKE(字段, '(匹配串1|匹配串2|...)$') ";//左模糊匹配

 

2、and优先级大于or;or加括号则优先执行or后执行and;所以查询结果不同。举例:

数据库存在数据:

FirstName LastName  /*行名称*/

Thomas Carter

William Carter

Thomas King

 

执行:SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'

 

会得到 lastname 必须为carter ,firstname 为 thomas 或者 william的人
thomas carter
william carter
执行:SELECT * FROM Persons WHERE FirstName='Thomas' OR FirstName='William' AND LastName='Carter'

<=>SELECT * FROM Persons WHERE (FirstName='Thomas') OR (FirstName='William' AND LastName='Carter')

 

可以得到 william carter 或者 firstname 为ithomas lastname 不一定是 carter的人 比如:
thomas carter
william carter
thomas king

 

posted @ 2020-03-10 15:50  马踏飞燕Beautiful  阅读(3144)  评论(0编辑  收藏  举报