这是我在玩基于 T-SQL的Stack Exchange Data Explorer时反复遇到的一个问题:
如何搜索字符串,除非它作为其他字符串的子字符串出现?
例如,如何选择MyTable
列MyCol
包含 string的表中的所有记录foo
,但忽略foo
属于 string 的任何 s foobar
?
一个快速而肮脏的尝试是这样的:
SELECT *
FROM MyTable
WHERE MyCol LIKE '%foo%'
AND MyCol NOT LIKE '%foobar%'
但显然这将无法匹配 eg MyCol = 'not all foos are foobars'
,我确实想匹配。
我想出的一种解决方案是foobar
用一些虚拟标记(不是 的子字符串foo
)替换所有出现的 s,然后检查任何剩余foo
的 s,如:
SELECT *
FROM MyTable
WHERE REPLACE(MyCol, 'foobar', 'X') LIKE '%foo%'
这可行,但我怀疑它不是很有效,因为它必须REPLACE()
在表中的每条记录上运行。(对于 SEDE,这通常是Posts
表,目前大约有 3000 万行。)有没有更好的方法来做到这一点?
(FWIW,提示这个问题的真正用例http://
是搜索带有使用方案前缀但不指向主机的图像 URL 的 SO 帖子i.stack.imgur.com
。)