SQL 服务器 xml select 部分匹配的值
SQL Server xml select values with partial match
我的问题是关于 select 从 xml 列中获取值,其中第一部分与另一列匹配。
即我有这个 xml:-
<PREFS>
<HIERARCHY>
<VALUE>[Hierarchy].[Country Name].&[IRELAND]</VALUE>
<VALUE>[Hierarchy].[Group Name].&[IRELAND]&[Ireland East Hospitals]</VALUE>
<VALUE>[Hierarchy].[Hospital Name].&[IRELAND]&[IR003]&[St Vincent's Hospital]</VALUE>
</HIERARCHY>
</PREFS>
我想 select 只输出以
[Hierarchy].[Group Name] - 这是另一个查询的结果。
我的 sql 看起来像这样,我在一个循环的中间,我正在寻找的值在一个变量中,并且被重新编码成一个层次结构,所以它有点混乱: -
SELECT
a.prefs.value('(/PREFS/HIERARCHY/VALUE/text())[1]', 'varchar(max)') as [ReportValue]
FROM (SELECT @User_defaults as [prefs] ) a -- a sql variable of XMl type contains the XML
CROSS APPLY (
-- Returns the thing I'm looking for i.e. "[Hierarchy].[Group Name]"
SELECT p.prompt
FROM @prompts p
WHERE UPPER(p.prompt) LIKE CASE WHEN @prompt = '[Hierarchy].[Group Name]'
THEN '%COUNTRY%'
WHEN @prompt = '[Hierarchy].[Hospital Name]'
THEN '%GROUP%'
ELSE 'XXXXXXXX' -- don't match
END
AND p.Parametername LIKE 'HC__%'
) s
WHERE
-- The bit where I just select the Value that matches, but it doesn't work!
LEFT(a.prefs.value('(/PREFS/HIERARCHY/VALUE/text())[1]', 'varchar(max)'),len(s.prompt) ) = s.prompt
它returns只有第一次匹配,第二次循环,没有结果,我不太明白如何部分匹配,感谢任何帮助。
如果您对包含检查感到满意,您可以这样做:
declare @User_defaults xml;
set @User_defaults = '
<PREFS>
<HIERARCHY>
<VALUE>[Hierarchy].[Country Name].&[IRELAND]</VALUE>
<VALUE>[Hierarchy].[Group Name].&[IRELAND]&[Ireland East Hospitals]</VALUE>
<VALUE>[Hierarchy].[Hospital Name].&[IRELAND]&[IR003]&[St Vincent''s Hospital]</VALUE>
</HIERARCHY>
</PREFS>'
select @User_defaults.value('(/PREFS/HIERARCHY/VALUE[contains(text()[1], sql:column("s.prompt"))])[1]', 'nvarchar(100)')
from (
-- Your query returning thing to look for
select N'[Hierarchy].[Group Name]' as prompt
) as s
使用 sql:column 从派生的 table 中获取值到 xQuery 表达式中。
我的问题是关于 select 从 xml 列中获取值,其中第一部分与另一列匹配。
即我有这个 xml:-
<PREFS>
<HIERARCHY>
<VALUE>[Hierarchy].[Country Name].&[IRELAND]</VALUE>
<VALUE>[Hierarchy].[Group Name].&[IRELAND]&[Ireland East Hospitals]</VALUE>
<VALUE>[Hierarchy].[Hospital Name].&[IRELAND]&[IR003]&[St Vincent's Hospital]</VALUE>
</HIERARCHY>
</PREFS>
我想 select 只输出以 [Hierarchy].[Group Name] - 这是另一个查询的结果。
我的 sql 看起来像这样,我在一个循环的中间,我正在寻找的值在一个变量中,并且被重新编码成一个层次结构,所以它有点混乱: -
SELECT
a.prefs.value('(/PREFS/HIERARCHY/VALUE/text())[1]', 'varchar(max)') as [ReportValue]
FROM (SELECT @User_defaults as [prefs] ) a -- a sql variable of XMl type contains the XML
CROSS APPLY (
-- Returns the thing I'm looking for i.e. "[Hierarchy].[Group Name]"
SELECT p.prompt
FROM @prompts p
WHERE UPPER(p.prompt) LIKE CASE WHEN @prompt = '[Hierarchy].[Group Name]'
THEN '%COUNTRY%'
WHEN @prompt = '[Hierarchy].[Hospital Name]'
THEN '%GROUP%'
ELSE 'XXXXXXXX' -- don't match
END
AND p.Parametername LIKE 'HC__%'
) s
WHERE
-- The bit where I just select the Value that matches, but it doesn't work!
LEFT(a.prefs.value('(/PREFS/HIERARCHY/VALUE/text())[1]', 'varchar(max)'),len(s.prompt) ) = s.prompt
它returns只有第一次匹配,第二次循环,没有结果,我不太明白如何部分匹配,感谢任何帮助。
如果您对包含检查感到满意,您可以这样做:
declare @User_defaults xml;
set @User_defaults = '
<PREFS>
<HIERARCHY>
<VALUE>[Hierarchy].[Country Name].&[IRELAND]</VALUE>
<VALUE>[Hierarchy].[Group Name].&[IRELAND]&[Ireland East Hospitals]</VALUE>
<VALUE>[Hierarchy].[Hospital Name].&[IRELAND]&[IR003]&[St Vincent''s Hospital]</VALUE>
</HIERARCHY>
</PREFS>'
select @User_defaults.value('(/PREFS/HIERARCHY/VALUE[contains(text()[1], sql:column("s.prompt"))])[1]', 'nvarchar(100)')
from (
-- Your query returning thing to look for
select N'[Hierarchy].[Group Name]' as prompt
) as s
使用 sql:column 从派生的 table 中获取值到 xQuery 表达式中。