草庐IT

sql - 在 SQL Server 2008 中检查 xml 字段的值

coder 2024-07-01 原文

我需要从 xml 字段中获取一些数据。 特殊问题是 xml 字段本身。

xml 字段就是这样构建的:

<UseAnsw>
  <User User="3" Answ="N" />
  <User User="2" Answ="N" />
  <User User="7" Answ="N" />
  <User User="5" Answ="N" />
  <User User="1" Answ="N" />
</UseAnsw>

Sql 表还有一个包含发布问题的用户的列。 我需要做的是,计算用户回答问题的频率。

举个例子:

use_ID    use_PostingUser     use_UseAnsw
00001     2                   <UseAnsw>
                                  <User User="3" Answ="N" />
                                  <User User="1" Answ="N" />
                                  <User User="7" Answ="N" />
                              </UseAnsw>
00002     4                   <UseAnsw>
                                  <User User="2" Answ="N" />
                                  <User User="1" Answ="N" />
                                  <User User="3" Answ="N" />
                              </UseAnsw>
00003     1                   <UseAnsw>
                                  <User User="3" Answ="N" />
                                  <User User="5" Answ="N" />
                                  <User User="8" Answ="N" />
                              </UseAnsw>

我寻找的那个例子的结果是:

User   AnswersGiven
1      2
2      1
4      0

我希望有人能理解我的尝试并能够帮助我(一个 sql 初学者,尤其是在涉及 xml 时)

最佳答案

我不明白,你的计数是如何工作的,但这可能会把你推向正确的道路:

DECLARE @tbl TABLE(use_ID VARCHAR(100),use_PostingUser INT,use_UseAnsw XML);
INSERT INTO @tbl VALUES
 ('00001',2,'<UseAnsw>
                                  <User User="3" Answ="N" />
                                  <User User="1" Answ="N" />
                                  <User User="7" Answ="N" />
                              </UseAnsw>')
,('00002',4,'<UseAnsw>
                                  <User User="2" Answ="N" />
                                  <User User="1" Answ="N" />
                                  <User User="3" Answ="N" />
                              </UseAnsw>')
,('00003',1,'<UseAnsw>
                                  <User User="3" Answ="N" />
                                  <User User="5" Answ="N" />
                                  <User User="8" Answ="N" />
                              </UseAnsw>');

此查询将返回所有数据

SELECT use_ID,use_postingUser
      ,Usr.value('@User','int') AS AttribUser
      ,Usr.value('@Answ','varchar(max)') AS AttribAnsw
FROM @tbl AS tbl
CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)

这里我使用相同的方法返回列 use_postingUser及其计数 User元素(实际上是同名属性)

SELECT use_postingUser
      ,COUNT(Usr.value('@User','int')) AS CountAttribUser
FROM @tbl AS tbl
CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)
GROUP BY use_PostingUser

希望这有助于...

更新

我还是不明白你的逻辑,但这可能更接近:

CTE “AllData”提供所有数据的列表(和以前一样)

在决赛中SELECT根据 XML 中 的用户编号计算每个用户的答案数。这对于 1,2 和 4(零 == 不存在)是可以的,但是还有更多您没有在预期输出中提及的 ID...

如果您需要播放所有 ID(带零的 4),您将需要所有用户的列表和一个 LEFT JOIN到 XML 的数据...

WITH AllData AS
(
    SELECT use_ID,use_postingUser
          ,Usr.value('@User','int') AS AttribUser
          ,Usr.value('@Answ','varchar(max)') AS AttribAnsw
    FROM @tbl AS tbl
    CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)
)
SELECT AttribUser
      ,COUNT(*) AS CountAttribUser
FROM AllData
GROUP BY AttribUser

更新 2

根据 Y.B 的评论,它可能是这样的:(使用上面声明的表变量)

WITH AllData AS
(
    SELECT use_ID,use_postingUser
          ,Usr.value('@User','int') AS AttribUser
          ,Usr.value('@Answ','varchar(max)') AS AttribAnsw
    FROM @tbl AS tbl
    CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)
)
SELECT DistinctUsers.use_PostingUser
      ,COUNT(AllData.AttribUser) AS CountAttribUser
FROM @tbl AS DistinctUsers
LEFT JOIN AllData ON DistinctUsers.use_PostingUser=AllData.AttribUser
GROUP BY DistinctUsers.use_PostingUser

关于sql - 在 SQL Server 2008 中检查 xml 字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38181104/

有关sql - 在 SQL Server 2008 中检查 xml 字段的值的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  3. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  4. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  5. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  6. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  7. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  8. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  9. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  10. ruby - 获取数组中的值并最小化某个类属性的最优雅的方法是什么? - 2

    假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)

随机推荐