在字符串中精确匹配两个字符 - SQL

3
如何查询一个包含人名的列,以获取仅包含恰好2个"a"的名称?我熟悉与LIKE一起使用的%符号,但它会找到所有具有1个a的名称,例如%a,但我需要仅查找那些恰好有2个字符的名称。请解释 - 先感谢您。

表名:"People"

列名:"Names,Age,Gender"

4个回答


4
使用'_a''_'是一个单字符通配符,其中'%'匹配0个或多个字符。如果需要更高级的匹配,请使用正则表达式,使用REGEXP_LIKE。请参见在Oracle数据库中使用正则表达式。当然,您也可以使用其他技巧。例如,您可以将字符串的长度与从中删除'a'的相同字符串的长度进行比较。如果差异为2,则字符串包含两个'a'。但是,很快就会变得很丑陋,因为当字符串为空时,长度返回“null”,因此如果要检查名称是否完全为“aa”,则必须对其进行异常处理。
select * from People
where
  length(Names) - 2 = nvl(length(replace(Names, 'a', '')), 0)

1
非常感谢。它起作用了 :) 我不知道 nvl 的用法,因为我是 SQL 的新手。如果您能给这个问题点个赞,那就太好了,因为它可能会帮助许多陷入同样困境的人 - 谢谢。 - Shumail
请注意,nvl 是 Oracle 的发明,不是 SQL 常用的函数。其他数据库如 SQL Server 使用 isnull。更便携的替代方案是 coalesce,但它有更多的字母,拼写更困难。;-) - GolezTrol

1
另一种解决方案是将除了a以外的所有内容替换为空,并检查结果字符串是否恰好为两个字符长:
select names 
from people
where length(regexp_replace(names, '[^a]', '')) = 2;

这也可以扩展到处理大写的 A:

select names 
from people
where length(regexp_replace(names, '[^aA]', '')) = 2;

SQLFiddle示例:http://sqlfiddle.com/#!4/09bc6

(注:此处为原文内容,无需翻译)

-1

select * from People where names like '__'; 也可以工作


欢迎来到StackOverFlow,伙计。你要回答的问题已经有很多答案了,其中一个答案已经被接受了。所以如果你不能为你的答案添加更多内容,请不要重复答案。在发布你的答案之前,请先检查你是否有新的、有效的内容,或者你是否在重复别人的答案。 - Chirag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接