oracle sql如何选择特定的单词

问题描述 投票:0回答:3

这是我的学校工作。虽然教授说'不要花太多时间在它上面',因为它被认为是一个脑筋急转弯,我想尝试解决它。不过我还有路要走。


返回联系人标题“Sales”作为标题第二个字的所有客户的所有联系人姓名和联系人标题,以下示例包含在当前数据中:

  • 副销售助理 - 应退回
  • Associate Salesmanager - 不应退回
  • 经理销售 - 应该退还
  • 销售经理助理 - 不应退回

enter image description here

sql oracle
3个回答
1
投票

使用LIKE的简单方法:

SELECT * FROM Customers WHERE 
  --Sales is a word on its own i.e. preceded and followed by a space
  --or Sales is a word on its own, at the end of the title
  (ContactTitle LIKE '% Sales %' OR ContactTitle LIKE '% Sales') AND 

  --and there is only one space before the word sales
  NOT ContactTitle LIKE '% % Sales%'

0
投票

这是一种方式:

with sampleData(col) as (
    select 'Associate Sales Assistant' from dual union all 
    select 'Associate Salesmanager' from dual union all 
    select 'Manager Sales' from dual union all 
    select 'Assistant to Sales Manager' from dual
)
select col
from sampleData
where regexp_like(col, '^[A-Za-z]+ Sales( |$)') 

这个怎么运作:

  • ^:字符串的开头
  • [A-Za-z]大写或小写字母;如果你的“单词”可能包含其他一些字符,你只需将其添加到括号中;例如,如果'aa_bb'是有效单词,则此部分应成为[A-Za-z_]
  • +前一部分的一次或多次出现
  • Sales一个空格,然后是“销售”
  • ( |$)一个空格或字符串的结尾

你可以用不同的patterns获得相同的结果;我相信这个很清楚


0
投票

我完成了substr()和instr()的组合。我讨厌使用REGEXP,除非没有其他方法可以做到这一点。

这应该让你接近......我认为你需要更多的条款。找到第二个单词并确保它是'Sales'的另一个instr,另一个在'Sales'之后验证它是一个空格或没有字符。

    WHERE substr(title_col, instr(title_col,' Sales')+1,5) = 'Sales'

编辑:在看到Aleksej的REGEXP解决方案之后,这看起来更具可读性和简单性。如果你想使用substr和instr,你需要更多where子句来处理不同的情况

编辑2:我最喜欢Caius Jard的解决方案。简单易读。

© www.soinside.com 2019 - 2024. All rights reserved.