【问题标题】:Search in sql based on pattern根据模式在sql中搜索
【发布时间】:2013-10-28 06:24:39
【问题描述】:

我有专栏employee_no varchar2(6)。我想获取所有具有employee_no 的记录,如010101121212232323 等。如何根据这种模式进行搜索?

【问题讨论】:

  • 这些是您要查找的唯一数字吗?这是“演示数据”的一个非常奇怪的选择——或者这是否意味着该模式也扩展到“898989”? “181818”呢?
  • 我知道我可以使用通配符之类的。我想要像 x(x+1)x(x+1)x(x+1) 这样的东西。我不想在“喜欢”运算符中写入整个预期结果。我想使用一些正则表达式。这可能吗?
  • 如果不提供所有初始序列对,即使是正则表达式也无法处理这个问题(正则表达式中没有 n/n+1 概念)。无论如何..我不使用Oracle,但请参阅Oracle 10g: Using Regular Expressions。正则表达式可能类似于:(01|12|23|34|45|56|67|78|89){3}。我不知道查询计划可能有何不同。
  • (哎呀,而不是 {3},请参阅 Ramblin 的答案中的捕获组。但是,请注意 n/n+1 概念是如何模拟
  • 抱歉我的愚蠢问题。我认为我可以使用一些循环而不是类似运算符中的硬编码模式使其更通用。

标签: sql oracle10g


【解决方案1】:

您是否正在寻找一组数字重复的员工编号? 如果是这样,那么您可以使用 REGEXP_LIKE。

select *
from yourtable
where regexp_like(employeeno, '(..)\1\1');

分解正则表达式模式,

(..)  --matches any two characters
\1    --matches the first group(the one in brackets)
\1    --matches the first group(the one in brackets)

Demo.

【讨论】:

  • 注意:这将匹配显示的 000000。
  • Ramblin 您的查询有效。但我们可以概括它,因为在括号中我必须提供两个字符。我们是否可以在过程中编写逻辑并在括号中迭代字符,例如第一次它将具有(01)第二次(12)。提前致谢
  • @saurabh “最好的”是根据我上面的评论提供一组有效的此类对。
  • @Ramblin.感谢您的回复。我想我可以让它更概括。
【解决方案2】:
select * from yourtable where emp_no like '%010101%' OR emp_no like '%121212%' OR 
emp_no like '%232323%'

【讨论】:

  • 既然“I have column employee no varchar2(6)”,那么LIKE好像不是最合适的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多