2013-01-23 84 views
0

我已經在包含XML數據的nvarchar(MAX)列的SQL Server 2008數據庫中有一個表。數據代表搜索條件。以下是搜索條件的XML,其中一個頂級「OR」組包含一個單一標準和一個嵌套雙標準「AND」組。SQL 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值的輸入,我需要搜索表,以查找是否有任何記錄其搜索條件指的是那些值中的一個(這些在之下的「INT」節點表示「FieldIDs」 節點)

通過運行此查詢:

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 

回答

1

抓取所有FieldIDs,並與該套組ID來覈對比較。 XQuery的=-operator在一個基於集合的語義中進行比較,所以如果左側的一個ID等於右側,則該表達式將評估爲true。

//FieldIDs/int = (42, 478) 

由於「478」是FieldID,此查詢將返回true。 「42」是不可用的。

我不確定您是否能夠將結果轉換爲某種sql-server-boolean-type,因爲我沒有運行一次,但您很容易就可以自己嘗試。


如果你也有興趣在包含的節點上,您可以使用此查詢:

//FieldIDs/int[. = (42,478)] 
+0

完美,這做到了。謝謝! –