2012-04-23 10 views
7

Ho una colonna di tipo di dati XML denominata "tag".Verificare se esiste un valore in una raccolta memorizzata nella colonna del tipo di dati XML

In questo, io sono la memorizzazione di una collezione, in questo modo:

<ArrayOfString> 
    <string>personal</string> 
    <string>travel</string> 
    <string>gadgets</string> 
    <string>parenting</string> 
</ArrayOfString> 

voglio selezionare tutte le righe, che hanno uno dei valori che io sto cercando: per esempio, voglio selezionare tutte le righe nella tabella che hanno un tag "viaggio".

So che questo funziona, se conosco l'indice del valore Cerco:

select * from posts 
where tags.value('(/ArrayOfString/string)[1]', 'nvarchar(1000)') = 'travel' 

ma questa query funziona solo se il tag "viaggio" è il secondo elemento in nodi. Come posso verificare se esiste un valore, indipendentemente dalla posizione in cui si trova?

risposta

7
select * 
from tags 
where tags.exist('/ArrayOfString/string[. = "travel"]') = 1 

O come questo se si desidera verificare una variabile.

declare @Val varchar(10) 
set @Val = 'travel' 

select * 
from tags 
where tags.exist('/ArrayOfString/string[. = sql:variable("@Val")]') = 1 
4

Si può provare qualcosa di simile:

SELECT 
    * 
FROM 
    dbo.Posts 
WHERE 
    tags.exist('/ArrayOfString/string/text()[. = "travel"]') = 1 

Ciò elencherà tutte le righe che hanno "viaggio" in una delle stringhe in XML

Problemi correlati