【问题标题】:Oracle LIKE pattern matchOracle LIKE 模式匹配
【发布时间】:2019-08-26 10:03:20
【问题描述】:

我在一个表中有 10 条记录。在这些记录中,我需要使用单个 Oracle 查询执行以下 3 个操作(说单个查询的原因是这是自动化框架的一部分,我需要保留单个通用查询)

操作1:获取所有10条记录

Select * from table_name where col01 like ('%')
<<10 records fetched>>

操作2:获取以字符串“Tivoli”开头的记录

Select * from table_name where col01 like ('Tivoli%')
<<1 record fetched>>

操作 3:获取不以“Tivoli”开头的记录
>

我无法为操作 3 编写查询,但我不想使用单独的 NOT LIKE 子句,因为这会使我完全创建单独的查询。

【问题讨论】:

  • not like 'Tivoli%' 有什么问题? (顺便说一句:字符串常量周围的括号完全没用)
  • 这意味着我必须使用 Not like 创建一个 More 查询。所以操作 1 和 2 使用 LIKE,操作 3 使用 NOT LIKE,这不是我想要的。这应该更像是一个通用查询
  • 如果您正在编写某种(查询编写)框架,能够否定条件是此类框架应该支持的最基本的事情之一。
  • 顺便问一下,case sensitivity 对您的特定字符串有影响吗?例如col01 可以有 TIVOLI..tIvOli.. 之类的值吗?
  • 请注意,第一个查询仅适用于 col01 不为空的行。它不会检索 col01 为空的任何行。您可以使用可选参数来正确处理此问题(例如where col01 like :pattern or :pattern is null)。请参阅我对此的回答。

标签: sql oracle oracle11g sql-like


【解决方案1】:

然后,您可以使用minus 集合运算符:

Select * from table_name -- all records
minus
Select * from table_name where col01 like 'Tivoli%' 
-- records for col01 column starts with Tivoli 

如果所有类型的Tivoli(如TIVOLI.. 或tIvOli 或..)都应不区分大小写,则可以将条件视为

where lower(col01) like 'tivoli%'

【讨论】:

  • 请注意,minus 会删除重复项,因此这可能不会返回 9 条记录。
【解决方案2】:

你可以使用:

select *
from table_name
where col01 not like 'Tivoli%'

如果col01 可以是NULL,那么您需要考虑到这一点:

select *
from table_name
where col01 not like 'Tivoli%' or col01 is null;

【讨论】:

  • where nvl(col01,'x') not like 'Tivoli%' 可能是第二个更短的选项。
【解决方案3】:
Select * from table_name where not (col01 like ('Tivoli%') )

【讨论】:

    【解决方案4】:

    您要求一个涵盖所有三个选项的通用查询。为此使用两个变量,并在您不想使用它们时将它们设置为 null:

    Select *
    from table_name
    where (col01 like :must_match or :must_match is null)
    and (col01 not like :must_not_match or col01 is null or :must_not_match is null);
    

    或者,如果你想让你的框架处理匹配或不匹配,选择所有带有标志的行:

    Select
      t.*,
      case when col01 like :pattern then 'match' else 'no match' end as is_match
    from table_name t;
    

    【讨论】:

      猜你喜欢
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多