【问题标题】:xQuery LIKE-operator (starts-with)xQuery LIKE 运算符(开头)
【发布时间】:2011-06-27 09:26:50
【问题描述】:

字段中的值如下

<en-US>Parameter23</en-US>
<it-IT>Parameter</it-IT>

SQL查询是

select * 
from parametermaster 
where cast(ParameterName as xml).exist('en-US/text()[contains(.,"P")]') = 1

我正在尝试这样做

select * 
from parametermaster 
where cast(ParameterName as xml).exist('en-US/text()[starts-with(.,"P")]') = 1

Is 给出错误为

消息 2395,第 16 级,状态 1,第 1 行
XQuery [exist()]:没有函数 '{http://www.w3.org/2004/07/xpath-functions}:starts-with()'

谁能帮帮我,我想在 SQL 2005 XQuery 中创建 LIKE 运算符的感觉。我是 XQuery 的新手。

【问题讨论】:

    标签: xml sql-server-2005 where-clause sql-like xquery-sql


    【解决方案1】:

    这个怎么样:

    select * 
    from parametermaster 
    where cast(ParameterName as xml).value("(en-US)[1]", "varchar(50)") LIKE 'P%'
    

    基本上:

    • 获取en-US XML 元素并将其值转换为varchar(50)
    • 然后在该 varchar(50) 列上执行常规的普通 SQL LIKE

    【讨论】:

    • 谢谢它的工作,但在 xml 中投射它然后再次在 varchar 这不好我想你能告诉我任何不双重投射的方法this中的值
    • @Harsh:是的 - 如果你有 XML,将其存储为数据类型 XML - 那么你不需要转换.....如果你 ParameterName 列是 @ 类型987654328@ 在 SQL Server 2005 中,您可以节省自己的演员表。顺便说一句:第二个操作不是强制转换(本身) - 它是数据提取,您只需定义结果将是什么数据类型。
    • 不幸的是,SQL Server 2005 只支持标准 XQuery 函数库的一小部分。你不能假设因为标准中有像starts-with 这样的函数,SQL Server 就会支持它。也没有matches()或replace(),这意味着字符串操作确实非常有限。
    【解决方案2】:

    starts-with()/ends-with() 可以替换为 substring() 和 string-length() 函数的组合:

    select * 
    from parametermaster 
    where cast(ParameterName as xml).exist('en-US/text()[substring(., 1, string-length("P")) = "P"]') = 1
    

    一般starts-with(a, b)等价于

    substring(a, 1, string-length(b)) = b
    

    and ends-with(a, b) 等价于

    substring(a, string-length(a) - string-length(b)) = b
    

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 2020-10-26
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 2012-07-06
      • 2016-11-03
      相关资源
      最近更新 更多