0

我在 SQL Server 2008 数据库中有一个表,其中包含一个包含 XML 数据的 nvarchar(MAX) 列。数据代表搜索条件。下面是搜索条件的 XML 的样子,其中一个顶级“OR”组包含一个单一条件和一个嵌套的两个条件“AND”组。

<?xml version="1.0" encoding="utf-16"?>
<SearchCriterionGroupArgs xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SingleCriteria>
    <SearchCriterionSingleArgs>
      <Operator>Equals</Operator>
      <Value>test</Value>
      <FieldIDs>
        <int>1026</int>
        <int>478</int>
      </FieldIDs>
      <EntityID>92</EntityID>
    </SearchCriterionSingleArgs>
  </SingleCriteria>
  <GroupCriteria>
    <SearchCriterionGroupArgs>
      <SingleCriteria>
        <SearchCriterionSingleArgs>
          <Operator>GreaterThan</Operator>
          <Value>2010-01-23</Value>
          <FieldIDs>
            <int>1017</int>
          </FieldIDs>
          <EntityID>92</EntityID>
        </SearchCriterionSingleArgs>
        <SearchCriterionSingleArgs>
          <Operator>LessThan</Operator>
          <Value>2013-01-23</Value>
          <FieldIDs>
            <int>1018</int>
          </FieldIDs>
          <EntityID>92</EntityID>
        </SearchCriterionSingleArgs>
      </SingleCriteria>
      <GroupCriteria />
      <EntityID>92</EntityID>
      <LogicalOperator>AND</LogicalOperator>
    </SearchCriterionGroupArgs>
  </GroupCriteria>
  <EntityID>92</EntityID>
  <LogicalOperator>OR</LogicalOperator>
</SearchCriterionGroupArgs>

给定一组 FieldID 值的输入,我需要搜索表以查找是否有任何记录的搜索条件引用其中一个值(这些在“FieldIDs”节点下的“int”节点中表示。)

通过运行此查询:

select CAST(OptionalConditions as xml).query('//FieldIDs')
from tblMyTable

我得到结果:

<FieldIDs>
  <int>1026</int>
  <int>478</int>
</FieldIDs>
<FieldIDs>
  <int>1017</int>
</FieldIDs>
<FieldIDs>
  <int>1018</int>
</FieldIDs>

(目前表中只有一条记录,其中包含 xml 数据。)

但是我才刚刚开始使用这些东西,我不知道检查这些列表是否存在任意一组 FieldID 的符号是什么。我不需要检索任何特定节点,只需要判断输入字段 ID 是否在搜索中的任何位置引用即可。

谢谢你的帮助!

编辑:使用Ranon的解决方案,我使用这样的查询让它工作:

SELECT *
FROM myTable
WHERE CAST(OptionalConditions as xml).exist('//FieldIDs/int[.=(1019,111,1018)]') = 1
4

1 回答 1

1

获取所有 FieldID 并将它们与要检查的设置 id ID 进行比较。XQuery 的=-operator 以基于集合的语义进行比较,因此如果左侧的 ID 之一与右侧的 ID 相等,则此表达式的计算结果为 true。

//FieldIDs/int = (42, 478)

由于“478”是一个 FieldID,因此该查询将返回 true。“42”是一个不可用的。

我不确定您是否能够将结果转换为某种 sql-server-boolean-type,因为我还没有运行它,但您可以轻松地自己尝试。


如果您也对包含的节点感兴趣,可以使用以下查询:

//FieldIDs/int[. = (42,478)]
于 2013-01-24T00:35:04.030 回答