FetchXML去除空格及字符串搜索匹配问题技术咨询
嘿,我来帮你搞定这两个FetchXML的问题,都是实际开发里常遇到的场景,咱们一步步说:
1. 如何在FetchXML中去除空格?
FetchXML本身没有专门的“一键去空格”属性,但可以利用它支持的XPath字符串函数来实现,常用的有两种方式:
方式一:使用translate()函数替换所有空格
translate()函数可以把目标字符串里的指定字符替换成另一个字符,这里咱们把空格替换为空字符串,就能彻底去掉所有空格。比如你要检索并处理telephone1字段的空格,FetchXML可以这么写:
<fetch> <entity name="contact"> <attribute name="fullname" /> <attribute name="telephone1" /> <attribute name="telephone1_clean" alias="telephone1_clean" formula="translate(telephone1, ' ', '')" /> </entity> </fetch>
这个查询会返回原始电话号码,同时返回一个去掉所有空格的别名字段telephone1_clean。
方式二:使用normalize-space()函数(适合处理首尾+连续空格)
如果你只是想去掉首尾空格,同时把中间连续的多个空格合并成一个,那normalize-space()更合适:
<fetch> <entity name="contact"> <attribute name="fullname" /> <attribute name="telephone1_normalized" alias="telephone1_normalized" formula="normalize-space(telephone1)" /> </entity> </fetch>
注意:这两种函数都支持在查询条件里使用,不止是返回字段时。
2. 电话号码带/不带空格的搜索匹配问题
确实,字符串类型的电话号码存在格式差异时,直接搜索会漏匹配。没有现成的属性可以直接开启“忽略空格搜索”,但有两种实用的解决思路:
思路一:在查询条件中动态处理两边的空格
直接在FetchXML的过滤条件里,把存储的电话号码去掉空格,和用户输入的无空格字符串做匹配。比如用户输入11111111,查询可以这么写:
<fetch> <entity name="contact"> <attribute name="fullname" /> <attribute name="telephone1" /> <filter> <condition attribute="telephone1" operator="eq" value="11111111" formula="translate(telephone1, ' ', '')" /> </filter> </entity> </fetch>
这里的formula属性会先把数据库里的telephone1字段去掉所有空格,再和用户输入的11111111比较,不管存储的是111 11 111还是11111111,都能匹配到。
思路二:提前创建计算字段(更高效)
如果这个搜索场景很频繁,建议在实体上创建一个计算字段,比如命名为telephone1_clean,设置计算规则为translate(telephone1, ' ', ''),让系统自动维护这个无空格的字段。之后搜索时直接针对这个计算字段查询,性能会更好:
<fetch> <entity name="contact"> <attribute name="fullname" /> <attribute name="telephone1" /> <filter> <condition attribute="telephone1_clean" operator="eq" value="11111111" /> </filter> </entity> </fetch>
这种方式适合长期使用,避免每次查询都执行字符串转换。
内容的提问来源于stack exchange,提问作者Ola Hansen

