2017-10-30 3 views
1

Das folgende SQL gibt 1 für alle Zeilen der zweiten und der dritten Spalte zurück. Aber sollte es nicht einfach 1 s für die erste Zeile zurückgeben?Prüfen, ob XML nur eine bestimmte Zeichenfolge ist?

with t as (select cast('SomeText' as xml) x 
       union all 
       select cast('<s>Test</s>' as xml) 
      ) 
    select * , 
      x.exist('contains(/text()[1], "SomeText.")') , 
      x.exist('/text() = "SomeText."') 
    from t 
    where x.exist('contains(/text()[1], "SomeText.")') = 1 
      and x.exist('/text() = "SomeText."') = 1; 

Ich weiß mit x.value('/', 'nvarchar(max)') = 'SomeText.' kann das Problem lösen.

Die Frage ist, warum die XQuery x.exist('/text() = "SomeText."') oder x.exist('contains(/text()[1], "SomeText.")') nicht funktionieren (immer True).

Antwort

2

Versuchen

with t as ( select cast('SomeText' as xml) x 
       union all 
       select cast('SomeText.' as xml) x 
       union all 
       select cast('<s>Test</s>' as xml) 
      ) 
    select * , 
      x.query('contains(/text()[1], "SomeText.")') , 
      x.query('/text() = "SomeText."'), 
      x.exist('.[contains(/text()[1], "SomeText.")]') , 
      x.exist('.[text()[1] eq "SomeText."]') 
    from t 

Welche

+-------------+------------------+------------------+------------------+------------------+ 
|  x  | (No column name) | (No column name) | (No column name) | (No column name) | 
+-------------+------------------+------------------+------------------+------------------+ 
| SomeText | false   | false   |    0 |    0 | 
| SomeText. | true    | true    |    1 |    1 | 
| <s>Test</s> | false   | false   |    0 |    0 | 
+-------------+------------------+------------------+------------------+------------------+ 

kehrt ich Ihren ursprünglichen Code zurückgibt diese Zeilen vorstellen, weil das Ergebnis false noch existiert.

declare @x xml; 
set @x=''; 
select @x.exist('false()'); 

zurückkehrt noch 1

+0

Dank. Die Bedingung sollte in '. [....]' für '.exist()' eingeschlossen sein. – ca9163d9

Verwandte Themen