【问题标题】:What is the difference between following SQL queries containing REGEXP_LIKE()?以下包含 REGEXP_LIKE() 的 SQL 查询有什么区别?
【发布时间】:2016-02-01 14:55:04
【问题描述】:
select distinct first_name 
from EMPLOYEES 
where regexp_like(first_name,'^[^AEIOU]*[^aeiou]$');    

select distinct first_name 
from EMPLOYEES 
where regexp_like(first_name,'^[^AEIOU].*[^aeiou]$');  

我正在尝试查找不以元音开头和结尾的员工名字。我提出了上述问题。现在我有两个问题:

  1. 上述语句是否返回有效输出(不以元音开头)。

  2. 上述语句是否总是返回相同的结果(我尝试时得到相同的结果)。

但是当我尝试以下两个查询时,它们给出了不同的输出

select distinct first_name 
from EMPLOYEES 
where regexp_like(first_name,'^[AEIOU]*[aeiou]$');    

select distinct first_name 
from EMPLOYEES 
where regexp_like(first_name,'^[AEIOU].*[aeiou]$');         

【问题讨论】:

  • 请澄清您的第二个问题,因为您自相矛盾。你得到相同的结果,但你得到不同的结果?
  • 以上问题结果相同,以下问题结果不同
  • 这就是我感到困惑的地方——这两组查询完全一样,我可以说。如果有细微差别,请突出显示。
  • 也就是说我会注意到^[^AEIOU]*[^aeiou]$ 和^[AEIOU].*[aeiou]$ 会给出不同的结果。区别在于中间的* 运算符适用于什么。
  • 如果您的意思是前两个查询“相对于彼此”给出不同的答案,请发表评论。

标签: sql oracle11g regexp-like


【解决方案1】:

1) 前两个查询没有给你有效的输出。它们匹配以小写元音开头或以大写元音结尾的名称。而且他们并不总是给出相同的结果:

  • Marcos 是第一个和第二个的匹配项
  • MARCOS 匹配第二个而不是第一个
  • allan 是两者的匹配项

2) 由于类似的原因,第二对呈现不同的输出。

你可以自己试试:Regular expressions 101

【讨论】:

  • 名字总是以大写字母开头怎么办?查询有效吗?
  • 我不明白你的观点什么是marcos,什么是allan?
  • 是的,Rahul,如果您可以强制名称始终以大写字母开头并始终以小写字母结尾,则查询有效。
  • 'allan' 是一个名字的例子,如果你不强制使用大写字母,就会证明你的查询是错误的。
  • 对于第二个问题,在第一个查询中,星号运算符(零个或多个)应用于 [AEIOU],而在第二个查询中,星号运算符应用于 '.' (点 - 任何字符)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2020-03-22
  • 2012-04-19
  • 1970-01-01
相关资源
最近更新 更多