SQL Oracle 中的通配符 [重复]

Posted

技术标签:

【中文标题】SQL Oracle 中的通配符 [重复]【英文标题】:WILDCARDS in SQL Oracle [duplicate] 【发布时间】:2020-01-31 12:26:56 【问题描述】:

我试图在 Oracle DB 中查找以 A、B 或 C 开头的所有名称,我编写了以下语法:

SELECT NUME FROM JUCATORI
WHERE NUME LIKE '[ABC]%';

但它没有给我任何名称(也没有错误),即使我确定我的数据库名称中的名称以 A、B 或 C 开头。

【问题讨论】:

【参考方案1】:

LIKE 不适用于字符集。 (我认为 T-SQL 扩展了 LIKE 以处理此类表达式,但 Oracle 的 SQL 没有。)您不会收到错误,因为 LIKE '[ABC]%' 会查找以左括号开头的字符串,然后是 A,然后是 B,然后是 C,然后是右括号

所以要么使用OR:

SELECT nume FROM jucatori WHERE nume LIKE 'A%' OR nume LIKE 'B%' OR nume LIKE 'C%';

或正则表达式:

SELECT nume FROM jucatori WHERE REGEXP_LIKE(nume, '^[ABC]');

【讨论】:

除了它可以使用通配符 - '%' 是通配符。它不适用于 '[ABC]' 的字符集。 @piezol:是的,这当然是正确的,毕竟这就是LIKE 的全部内容:-) 我会相应地更新我的答案。谢谢。【参考方案2】:

一个选项是

where substr(nume, 1, 1) in ('A', 'B', 'C')

【讨论】:

【参考方案3】:

您将正则表达式与“喜欢”条件混淆了。

Like 检查您传递给它的字符串,只有三个例外:

1. %    - any number of any characters
2. _    - any single character

3. ESCAPE clause that lets you define escape character 
so you can use %  as 'I'm looking for percent sign'

[ABC] 意思是“A、B 或 C”是正则表达式语法。 您可能想改用 regexp_like,或者对于这样简单的查询,只需“或”几个喜欢:

with examples as (
   select 'Adam' ex from dual union all
   select 'Dorothy' ex from dual union all
   select '[ABC]something' ex from dual union all
   select '[ABC]' from dual
)
select e.ex,
       case when e.ex like '[ABC]%' then 'MATCHES' else null end as matches_like,
       case when regexp_like(e.ex, '^[ABC].?') then 'MATCHES' else null end as matches_regexp_like,
       case when e.ex like 'A%' or e.ex like 'B%' or e.ex like 'C%' then 'MATCHES' else null end as matches_complex_like
  from examples e

【讨论】:

以上是关于SQL Oracle 中的通配符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询从通配符列等于值的所有表中选择所有行[重复]

SQL查询从通配符列等于值的所有表中选择所有行[重复]

无法将多个参数传递给 SQL 语句到通配符 [重复]

使用具有相对日期范围和标准 SQL 的 Bigquery Table 通配符 [重复]

SQL之toplike通配符inbetween

SQL TOP 子句SQL LIKE 操作符SQL 通配符