Tsql 如何在LIKE查询中忽略零宽度空格字符,或解决此问题?
德语有时使用长度荒谬的词语。只要它们在运行时保持不变,这就不是问题,细心的设计者只会在语法规则允许的情况下应用换行。现在我们有了一个应用程序,其中标签可以在运行时由用户配置。我知道这是一个坏主意的10个原因,可能的解决方案不需要解决这个问题,这是一个业务需求 我们编写了一个基于SQLServer数据库的翻译工具,UX团队和翻译人员都可以通过部分标记匹配查找字符串,实现如下Tsql 如何在LIKE查询中忽略零宽度空格字符,或解决此问题?,tsql,Tsql,德语有时使用长度荒谬的词语。只要它们在运行时保持不变,这就不是问题,细心的设计者只会在语法规则允许的情况下应用换行。现在我们有了一个应用程序,其中标签可以在运行时由用户配置。我知道这是一个坏主意的10个原因,可能的解决方案不需要解决这个问题,这是一个业务需求 我们编写了一个基于SQLServer数据库的翻译工具,UX团队和翻译人员都可以通过部分标记匹配查找字符串,实现如下 SELECT Literal FROM Translations WHERE LCID=N'de' AND Literal
SELECT Literal FROM Translations WHERE LCID=N'de' AND Literal LIKE N'%'+@token+N'%'
我知道这不是SARGable,目前它的性能相当好,因此可能的解决方案不需要解决这个问题
翻译人员已经养成了“包括”的习惯" 作为文本中的连字符点,如下所示:
恩特格尔特福萨隆安斯普鲁奇
实际上,您可以复制并粘贴该字符串中的空格,有两个,一个在“Entgelt”之后,一个在“anspruch”之前
在运行时,这就像一个符咒。在设计时,现在不可能复制并粘贴“Entgeltfortzahlungsanspruch”(没有不可见的空格!)进入工具的搜索框并获取结果,因为LIKE
操作符不会忽略这些空格。这已成为一个问题,因为团队成员一直在添加相同的字符串,认为它尚未包含在词汇表中
是否有之类的语法变戏法、regex-magic或其他巧妙的算法允许在搜索中忽略零宽度空格,但仍将其保留在数据中
以前的研究:从搜索“tsql”和“零宽度空间”时出现的四个问题“,部分相关,我们实际上已经实现了部分,因为应用程序已经可以处理重音敏感/不敏感。但是我找不到任何信息暗示排序规则或TRIM
ming将有助于处理这种内部空白。因为像“%foo%”这样的列无论如何都不能使用索引,所以WHERE REPLACE(col,'', '') 类似于“%foo%”
(它将数据库中没有ZWS的字符串与用户输入的foo进行比较,用户输入的foo可能也没有ZWS)
(如果不明显,第一个“空”字符串实际上不是空的:D)
由于col
中的所有值都需要在查询时处理,因此它确实会对性能造成一点影响。如果您可以腾出空间和工程来这样做,您可以通过设置另一列来缩短处理时间,该列一开始不会有任何ZW(即,有一列带有的Entgelt)福萨隆anspruch'
和一列带有'Entgeltfortzahlungsanspruch'
)。您可以通过在客户端代码中显式添加这两个列,或者使用触发器来填充另一列,方法是在插入或更新时间中删除ZWS。顺便说一句,为什么不使用“软连字符”(U+00AD)而不是“零宽度空间”(U+200B)?(这与回答您的问题无关,我只是想知道。)一种方法是添加一个(持久化的)计算列,该列包含没有零宽度空格的数据,并在该列上进行搜索。(搜索字符串也应该删除零宽度空格。)FWIW,answer演示了一种从TSQL.brilliant中的字符串中裁剪.NET空白字符的方法。我的最终表达式是REPLACE(sLiteral,nchar(173),N''),比如@token--U+00AD软连字符
,这样后代就不太想优化它了。