Mik*_*nes 4 sql-server sql-server-2016 string-searching
在CASE表达式中,我试图在文本列中搜索以识别连字符 (-):
CASE
WHEN SUBSTRING(al.ALT_ADDRESS,1,1) IN('1','5','7')
AND al.NEW_ADDRESS CONTAINS '-'
THEN CONCAT(al.ALT_ADDRESS,al.NEW_ADDRESS)
Run Code Online (Sandbox Code Playgroud)
连字符可以位于列中的任何位置,因此我只需要知道它是否存在,而不管它在列中的实际位置。
我目前正在使用与@Josh 提供的完全相同的代码( LIKE '%-%'),但它不起作用,因为它没有为我知道它“应该”的几个特定实例返回正确的数据。确切的文字ALT_ADDRESS是:“2754 Churchill Circle”。确切的文字NEW_ADDRESS是:“O-89421”。但是,返回的结果不包括NEW_ADDRESS(O-89421)。
我已经确认破折号NEW_ADDRESS确实与我使用搜索(ASCII 45)的破折号相匹配。
Jos*_*ell 14
您没有提到为什么您提供的代码不起作用。 CONTAINS用于 SQL Server 的全文搜索功能。如果您不使用它,那么您需要使用LIKE带有通配符的子句:
CASE WHEN SUBSTRING(al.ALT_ADDRESS,1,1) IN('1','5','7') AND al.NEW_ADDRESS LIKE '%-%'
THEN CONCAT(al.ALT_ADDRESS,al.NEW_ADDRESS)
Run Code Online (Sandbox Code Playgroud)
即使您使用全文搜索,与破折号的匹配行为也可能出乎意料,Microsoft 建议LIKE改为使用。
您可能会仔细检查该字符是否真的是连字符,这样的操作应该有效:
SELECT
ASCII('-') as RealHypen,
ASCII(SUBSTRING(NEW_ADDRESS, 1, 1))
FROM YourTable
WHERE ALT_ADDRESS = '2754 Churchill Circle';
Run Code Online (Sandbox Code Playgroud)
LIKE顺便说一句,上面的表达式无法利用 SQL Server 中 b 树索引的查找能力,因此如果需要大量扫描操作,则可能会影响大型表的性能。缓解这种情况的最佳方法(它是否适用于您或处于类似情况的其他人)在很大程度上取决于上下文,但通常主要的替代方法是:
如果您有兴趣探索性能方面,请提出后续问题。
kev*_*hat 10
现有答案的另一种方法是使用 CHARINDEX() 函数,如果存在,则返回指定字符串的位置,否则返回 0。
select charindex('-','kevin-')
Run Code Online (Sandbox Code Playgroud)
将返回 6,因为连字符位于字符串的第 6 个位置,与
select charindex('-','kevin')
Run Code Online (Sandbox Code Playgroud)
返回 0,因为字符串中不存在“-”。
根据John Eisbrener 的建议,PATINDEX这也是一种选择,它允许使用通配符——这在某些情况下可能证明是有益的。