2012-10-18 16 views
79

Ich versuche, eine bestimmte Zeile nach Name in meiner SQL-Datenbank abzufragen, und es hat ein Et-Zeichen. Ich habe versucht, einen Escape-Charakter zu setzen und dann dem Ampersand zu entkommen, aber aus irgendeinem Grund funktioniert das nicht und ich bin unsicher, was genau mein Problem ist.Escaping kaufmännisches Zeichen in SQL-Zeichenfolge

Set escape '\' 
    select * from V1144engine.T_nodes where node_id in(
    select node2_id from V1144engine.T_edges where node1_id in(
    select node2_id from V1144engine.T_edges where node1_id in(
    select node2_id from V1144engine.T_edges where node1_id = 
     (select node_id from V1144engine.T_nodes where node_name = 'Geometric Vectors \& Matrices'))) 
    and edge_type_id = 1) 
    and node_type_id = 1 
    and node_id in (
    select node2_id from V1144engine.T_edges where node1_id = 
     (select node_id from V1144engine.T_nodes where node_name = 'Algebra II') 
    and edge_type_id = 2); 

Obwohl dies eine ähnliche Lösung zu this question hat, werden die Probleme ganz anders gestellt. Sie können am Ende die gleiche Lösung haben, aber das bedeutet nicht, dass die Fragen gleich sind.

+0

ich glaube nicht, dass Sie das Zitat um die Escape-Zeichen ('\') benötigen – mcalex

+17

'set define off' ist der einfachste Weg, es zu tun. – Annjawn

+1

Duplikat von http://stackoverflow.com/questions/118190/how-do-i-ignore-ampersands-in-a-sql-script-running-from-sql-plus – LordScree

Antwort

124

Statt

node_name = 'Geometric Vectors \& Matrices' 

Verwendung

node_name = 'Geometric Vectors ' || chr(38) || ' Matrices' 

38 ist der ASCII-Code für Et-Zeichen, und in dieser Form wird es als String, nichts anderes interpretiert werden. Ich habe es versucht und es hat funktioniert.

Eine andere Möglichkeit LIKE verwenden könnte und einen Unterstrich anstelle der ‚&‘ Charakter:

node_name LIKE 'Geometric Vectors _ Matrices' 

Die Chance, dass Sie auch einen anderen Datensatz finden, die in nur diesen einen Charakter ist anders, ganz ist niedrig.

+28

Anstelle des nicht intuitiven 'chr (38)' können Sie 'node_name = 'Geometrische Vektoren &' || verwenden 'Matrizen' –

27

können Sie verwenden

set define off 

Mit dieser es für die Eingabe nicht aufgefordert wird

81

Escape is set to \ by default, so dass Sie sie nicht festlegen müssen; aber wenn Sie es tun, wickeln Sie es nicht in Anführungszeichen ein.

Ampersand ist der SQL * Plus substitution variable Marker; aber man kann change it oder mehr nutzbringend in Ihrem Fall schalten Sie es aus vollständig, mit:

set define off 

Dann müssen Sie nicht die Mühe machen, den Wert überhaupt zu entkommen.

+0

Völlig einverstanden! – Annjawn

+1

Das Escape * -Zeichen * ist standardmäßig auf '\' gesetzt, aber der boolesche Parameter 'escape' ist standardmäßig auf OFF gesetzt. Das OP muss also möglicherweise das Escape-Zeichen nicht setzen, aber er/sie muss mindestens "ESCAPE ON" setzen, damit das funktioniert. Oder nutzen Sie natürlich eine der anderen, besseren Lösungen. – mathguy

19

direkt aus Oracle SQL-Grundlagen Buch

SET DEFINE OFF 
select 'Coda & Sid' from dual; 
SET DEFINE ON 

wie würde man es verlassen, ohne definieren Einstellung.

+2

Das Hinzufügen von SET DEFINE ON ist hilfreich. – KSev

0
REPLACE(<your xml column>,'&',chr(38)||'amp;') 
0

Dies funktioniert auch:

select * from mde_product where cfn = 'A3D"&"R01'

Sie & als wörtliche definieren, indem Sie mit Doppel qoutes "&" im String ist umschließt.

+0

Wenn Sie das tun, werden die doppelten Anführungszeichen Teil der Zeichenfolge, wie folgt: 'A3D" & "R01' –

1
set escape on 
... node_name = 'Geometric Vectors \& Matrices' ... 

oder alternativ:

set define off 
... node_name = 'Geometric Vectors & Matrices' ... 

Der erste können Sie den umgekehrten Schrägstrich verwenden, um die & zu entkommen.

Die zweite deaktiviert & "global" (keine Notwendigkeit, einen Backslash irgendwo hinzuzufügen). Sie können es wieder einschalten, indem Sie set define off eingeben und von dieser Zeile an erhalten die Ampersands ihre spezielle Bedeutung zurück, so dass Sie sie für einige Teile des Skripts ausschalten können und nicht für andere.

Verwandte Themen