oracle sql如何选择特定单词

时间:2019-03-13 15:54:32

标签: sql oracle

这是我的学校作业。尽管教授说“不要花太多时间”,因为据说这是个脑筋急转弯,但我想尝试解决它。但是,我仍然任重道远。


  

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

     
      
  • 销售助理-应该退回
  •   
  • 关联销售经理-不应退回
  •   
  • 经理销售-应退回
  •   
  • 销售经理助理-不应退回
  •   

enter image description here

3 个答案:

答案 0 :(得分: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%'

答案 1 :(得分: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后跟一个空格,“ Sales”(销售)
  • ( |$)空格或字符串的结尾

您可以使用不同的patterns获得相同的结果;我相信这一点很清楚

答案 2 :(得分:0)

substr()和instr()的组合是我要做的。我讨厌使用REGEXP,除非没有其他方法。

这应该使您接近...我需要更多一些where子句。另一个指令找到第二个单词并确保它是“ Sales”,另一个指令验证“ Sales”之后是空格还是没有字符。

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

编辑:看到Aleksej的REGEXP解决方案后,它看起来更易读和更简单。如果要使用substr和instr,则需要更多的where子句来处理不同的情况

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