SQL XML contains() 和 fn:lowercase()
SQL XML contains() with fn:lowercase()
我正在尝试使用 contains() 语句中的小写 text() 值进行此 Xpath 查询。例如,搜索“纽约”与“纽约”将 return 不同的结果。
我打算确保从现在开始进入存储过程的参数是小写的,但我需要确保 XML 中的 text() 也是小写的。我尝试了几种不同的方法,但不断出现语法错误。注意:我正在搜索 New York 的 <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>
谢谢
这是正确的方法。
您需要为 contains()
函数的两个参数应用 lower-case()
函数。
这种方式的存储过程参数绝对可以是任何大小写:upper、lower、mixed 等
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;
我正在尝试使用 contains() 语句中的小写 text() 值进行此 Xpath 查询。例如,搜索“纽约”与“纽约”将 return 不同的结果。
我打算确保从现在开始进入存储过程的参数是小写的,但我需要确保 XML 中的 text() 也是小写的。我尝试了几种不同的方法,但不断出现语法错误。注意:我正在搜索 New York 的 <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>
谢谢
这是正确的方法。
您需要为 contains()
函数的两个参数应用 lower-case()
函数。
这种方式的存储过程参数绝对可以是任何大小写:upper、lower、mixed 等
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;