0

SQL Server 2008データベースに、XMLデータを含むnvarchar(MAX)列を持つテーブルがあります。データは検索条件を表します。これは、1つの単一基準を含む1つのトップレベルの「OR」グループとネストされた2つの基準の「AND」グループを持つ検索条件のXMLの外観です。

<?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値の入力セットが与えられた場合、テーブルを検索して、検索条件がそれらの値の1つを参照するレコードがあるかどうかを見つける必要があります(これらは「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データを含むレコードが1つだけあります。)

しかし、私はこのようなものを始めたばかりであり、FieldIDの任意のセットの存在についてそれらのリストをチェックするための表記法が何であるかわかりません。特定のノードを取得する必要はありません。入力フィールドIDが検索のどこかで参照されているかどうかについてはtrueまたはfalseだけです。

ご協力いただきありがとうございます!

編集:Ranonのソリューションを使用して、次のようなクエリを使用して動作させました:

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

1 に答える 1

1

すべてのFieldIDを取得し、それらを設定されたIDIDと比較してチェックします。XQueryの=-operatorはセットベースのセマンティクスで比較するため、左側のIDの1つが右側のIDと等しい場合、この式はtrueと評価されます。

//FieldIDs/int = (42, 478)

「478」はFieldIDであるため、このクエリはtrueを返します。「42」は利用できないものです。

まだ実行していないため、結果をsql-server-boolean-typeにキャストできるかどうかはわかりませんが、簡単に試すことができます。


含まれているノードにも関心がある場合は、次のクエリを使用できます。

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