这是我的学校工作。虽然教授说'不要花太多时间在它上面',因为它被认为是一个脑筋急转弯,我想尝试解决它。不过我还有路要走。
返回联系人标题“Sales”作为标题第二个字的所有客户的所有联系人姓名和联系人标题,以下示例包含在当前数据中:
- 副销售助理 - 应退回
- Associate Salesmanager - 不应退回
- 经理销售 - 应该退还
- 销售经理助理 - 不应退回
使用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%'
这是一种方式:
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获得相同的结果;我相信这个很清楚
我完成了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的解决方案。简单易读。