Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 如何在LIKE查询中忽略零宽度空格字符,或解决此问题?_Tsql - Fatal编程技术网

Tsql 如何在LIKE查询中忽略零宽度空格字符,或解决此问题?

Tsql 如何在LIKE查询中忽略零宽度空格字符,或解决此问题?,tsql,Tsql,德语有时使用长度荒谬的词语。只要它们在运行时保持不变,这就不是问题,细心的设计者只会在语法规则允许的情况下应用换行。现在我们有了一个应用程序,其中标签可以在运行时由用户配置。我知道这是一个坏主意的10个原因,可能的解决方案不需要解决这个问题,这是一个业务需求 我们编写了一个基于SQLServer数据库的翻译工具,UX团队和翻译人员都可以通过部分标记匹配查找字符串,实现如下 SELECT Literal FROM Translations WHERE LCID=N'de' AND Literal

德语有时使用长度荒谬的词语。只要它们在运行时保持不变,这就不是问题,细心的设计者只会在语法规则允许的情况下应用换行。现在我们有了一个应用程序,其中标签可以在运行时由用户配置。我知道这是一个坏主意的10个原因,可能的解决方案不需要解决这个问题,这是一个业务需求

我们编写了一个基于SQLServer数据库的翻译工具,UX团队和翻译人员都可以通过部分标记匹配查找字符串,实现如下

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软连字符
,这样后代就不太想优化它了。