SQL XML contains() 和 fn:lowercase()

Posted

技术标签:

【中文标题】SQL XML contains() 和 fn:lowercase()【英文标题】:SQL XML contains() with fn:lowercase() 【发布时间】:2020-10-23 18:15:49 【问题描述】:

我正在尝试在我的 contains() 语句中使用小写的 text() 值进行此 Xpath 查询。例如,搜索“New York”和“New york”会返回不同的结果。

我计划从现在开始确保参数是小写进入存储过程,但我需要确保 XML 中的 text() 也是小写。我尝试了几种不同的方法,但不断收到语法错误。注意:我正在搜索纽约的<Company> 节点,以确保我没有得到任何与<City> 节点匹配的记录。我从常规的全文 contains() 开始,但后来为了准确而转向 XPath。

DECLARE @Company nvarchar(100) = "new york"

SELECT ...
FROM OrderObject o
WHERE o.Address.exist('//Company/text()[contains(.,sql:variable("@Company"))]') = 1)

XML is like this... shorted for brevity
<Address>
<Company>1</Company>
<City>2</City>
<State>3</State>
</Address>

谢谢

【问题讨论】:

【参考方案1】:

这是一个正确的方法。

您需要为contains() 函数的两个参数应用lower-case() 函数。

这种方式存储过程参数绝对可以是任何情况:上、下、混合等。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<Address>
    <Company>1</Company>
    <City>NeW YoRk</City>
    <State>NY</State>
</Address>'),
(N'<Address>
    <Company>2</Company>
    <City>Miami</City>
    <State>FL</State>
</Address>');
-- DDL and sample data population, end

DECLARE @City NVARCHAR(100) = 'new york';

SELECT * 
FROM @tbl
WHERE xmldata.exist('/Address/City[contains(lower-case((./text())[1]),lower-case(sql:variable("@City")))]') = 1;

【讨论】:

感谢您的回复。我发现确保参数以小写形式出现(或在使用前设置为小写形式)显着提高了我的性能。

以上是关于SQL XML contains() 和 fn:lowercase()的主要内容,如果未能解决你的问题,请参考以下文章

SVN Error:The XML response contains invalid XML

正则表达式 包含在 XML 元素中

xml Skeleton pom file.Contains编译器插件和测试依赖项

SVN 报错 :The XML response contains invalid XML

SVN 问题解决之 The XML response contains invalid XML

mybatis中Invalid bound statement (not found) 和 Result Maps collection already contains value for...错误