SQL如何获取XML数据列的值并在where子句中使用它

用户名

我有一个表,其XML数据类型列称为SettingsXML数据的结构

<root>
<Setting1>true</Setting1>
<Setting2>false</Setting2>
...
<root>

表格中还有一ID列,我想用来对结果进行分组。我想计算每个Setting1设置了多少个配置注意:该字段不是唯一的,可以重复。trueIDID

这是我到目前为止的内容:

with xmlnamespaces (DEFAULT '...')
select count(Setting1) as counts
  from (select Settings.value('(/root/Setting1)[1]', 'nvarchar(max)') as Setting1
    from MY_TABLE
    group by ID) res
  where Setting1= 'true'

但是我收到以下错误:

选择列表中的“ MY_TABLE.Configuration”列无效,因为它既不包含在聚合函数中也不在GROUP BY子句中。

Shnugo

尽管您已经有了答案,但我想添加一些替代方法:

(为Michal Turczyn提供样机)

declare @tbl table (id int, xmlCol xml);
insert into @tbl values
(1, '<root>
<Setting1>true</Setting1>
<Setting2>false</Setting2>
</root>'),
(1, '<root>
<Setting1>true</Setting1>
<Setting2>false</Setting2>
</root>'),
(2, '<root>
<Setting1>false</Setting1>
<Setting2>false</Setting2>
</root>'),
(2, '<root>
<Setting1>true</Setting1>
<Setting2>false</Setting2>
</root>');

最快的应该是简单的XML.exist()

SELECT t.id,
       sum(CASE WHEN t.xmlCol.exist('/root/Setting1[text()="true"]')=1 THEN 1 ELSE 0 END) howManyTrue
FROM @tbl t
GROUP BY t.id

您可以使用变量在语句外设置SettingName来增强此功能:

DECLARE @SettingName NVARCHAR(100)=N'Setting1';

SELECT t.id,
       sum(CASE WHEN t.xmlCol.exist('/root/*[local-name()=sql:variable("@SettingName") and text()="true"]')=1 THEN 1 ELSE 0 END) howManyTrue
FROM @tbl t
GROUP BY t.id

-并且,如果一个XML设置可能在多个XML中出现多次,则可以使用XQuery的count()

SELECT t.id,
       sum(t.xmlCol.value('count(/root/*[local-name()=sql:variable("@SettingName") and text()="true"])','int')) howManyTrue
FROM @tbl t
GROUP BY t.id

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何对存储在表中的值执行按位运算,并在sql查询的where子句中使用它?

有没有办法提取列值并在 where 子句中使用它?

如何从oracle 11g中的日期比较月和日的值并在where子句中使用它?

获取子字符串并在 Where 子句中使用它

从 Postgres 中的子查询构造值的 ARRAY 并在 WHERE 子句中使用它

如何获取数据属性的值并在jquery中使用它?

如何在where / and子句中使用sql选定的数据

SQL在where子句中使用子查询并在select中使用值

如何在select语句中添加列并在where子句中使用ir

SQL - 如何在 where 子句中使用逗号分隔的列值

如何在 SQL Server 数据库的 where 子句中使用基于日期获取数据的 case 语句

如何从SQL中的日期提取年份并在where子句中使用

Oracle:声明多个常量并在 WHERE 子句中使用它们

如何创建一个变量/参数,它是 SQL SSMS 中的一串值,我可以在我的 where 子句中使用它作为替代?

如何在WHERE子句中使用XML.modify'替换值'

postgresql:如何在where子句中使用变量(行的某个列值)

如何在SQL的Where子句中使用View元素

如何在SQL Where子句中使用多个And条件

如何在SQL的where子句中使用sum?

如何在 SQL Server 的 where 子句中使用别名

在 where 子句中使用表值

在WHERE子句中使用Count值

如何在更新语句的SQL Server中的WHERE子句中使用多个列

如何将 SQL 查询转换为 PHP 并在 WHERE 子句中使用 AND 运算符

在Spark SQL的'WHERE'子句中使用'as'

在where子句中使用别名-SQL

SQL在where子句中使用CASE

在“ where”子句中使用新列

如何用函数替换where子句并在存储过程中使用它?