2012-05-06 15 views
15

Voglio cercare una colonna con valori XML per vedere se contiene una stringa. Non conosco lo schema, voglio sapere se la stringa è contenuta ovunque. Non so se XPATH funzionerebbe in questa situazione.Ricerca XML con un'operazione di ricerca completa simile o simile

L'equivalente di

Select s.Name, ts.ValueXML from table t (nolock) 
join table2 ts (nolock) on t.key_Id = ts.key_Id 
join table3 s (nolock) on ts.key_Id=s.key_Id 
where s.Name like '%Lab%' and ts.ValueXML like '%PreviewDateRange%' 

ERROR: Argument data type xml is invalid for argument 1 of like function.

importanti colonne ts Tabella

ValueXml (XML(.), null)

L'articolo che sto cercando dovrebbe essere un attributo. Quindi, se quanto sopra non è possibile, qualsiasi cosa contenga quell'attributo sarebbe una buona alternativa.

+0

Questo dovrebbe funzionare. Potresti mostrare un esempio in cui non funziona? – dasblinkenlight

+1

Potresti postare la definizione della tabella e taggare la domanda con il tipo di RDBMS che stai utilizzando? – dasblinkenlight

risposta

35

Il più semplice (ma sicuramente non il più veloce da eseguire) modo sarebbe quello di lanciare la vostra colonna per nvarchar(max) prima di passarlo a like:

cast(ValueXml as nvarchar(max)) like '%PreviewDateRange%' 
+0

Questa è una query non di produzione, una sola. Le prestazioni non contano. Ho provato questo e ho ottenuto l'errore: Conversione di uno o più caratteri da XML a confronto di destinazione impossibile –

+1

@ P.Brian.Mackey Dovrebbe fare il trucco allora - Ho provato su ['sqlfiddle'] (http://sqlfiddle.com/#! 3/742c5/3), e ha funzionato bene. – dasblinkenlight

+0

Modifica richiesta quando la risposta in prosa menziona cast varchar e il codice menziona nvarchar. Varchar va bene, ma se si riscontra una conversione di confronto, è possibile utilizzare nvarchar: questa era la parte di cui avevo bisogno. – MattH

2

ci si va:

SELECT * 
FROM MyTable 
WHERE MyXmlMetadataColumn.exist('//*/text()[contains(upper-case(.),upper-case("MySearchTerm"))]') = 1 

Questo sembra per funzionare bene per me e inoltre non cerca i nomi dei tag XML come soluzione fornita da "dasblinkenlight".

Non so quanto sia performante.

Problemi correlati