这是我的学校作业。尽管教授说“不要花太多时间”,因为据说这是个脑筋急转弯,但我想尝试解决它。但是,我仍然任重道远。
返回所有联系人姓名,以及所有联系人标题为“ Sales”的第二个单词的客户的标题,当前数据中包含以下示例:
- 销售助理-应该退回
- 关联销售经理-不应退回
- 经理销售-应退回
- 销售经理助理-不应退回
答案 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的解决方案。简单易读。