Escapezeichen für kaufmännisches Und in SQL-Zeichenfolge

143

Ich versuche, eine bestimmte Zeile nach Namen in meiner SQL-Datenbank abzufragen, und sie hat ein kaufmännisches Und. Ich habe versucht, einen Escape-Charakter festzulegen und dann dem kaufmännischen Und zu entkommen, aber aus irgendeinem Grund funktioniert dies nicht und ich bin mir nicht sicher, was genau mein Problem ist.

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 für diese Frage hat , sind die Probleme sehr unterschiedlich gestellt. Sie haben möglicherweise die gleiche Lösung, aber das bedeutet nicht, dass die Fragen gleich sind.

Slater Victoroff
quelle
Ich glaube nicht, dass Sie das Zitat um den
Fluchtcharakter
29
set define offist der einfachste Weg, dies zu tun.
AnBisw
1
Duplikat von stackoverflow.com/questions/118190/…
oliver-clare

Antworten:

205

Anstatt

node_name = 'Geometric Vectors \& Matrices'

verwenden

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

38 ist der ASCII-Code für kaufmännisches Und, und in dieser Form wird er als Zeichenfolge interpretiert, sonst nichts. Ich habe es versucht und es hat funktioniert.

Eine andere Möglichkeit könnte darin bestehen, LIKE und eine Unterstreichung anstelle des Zeichens '&' zu verwenden:

node_name LIKE 'Geometric Vectors _ Matrices' 

Die Wahrscheinlichkeit, dass Sie auch einen anderen Datensatz finden, der sich nur in diesem einen Charakter unterscheidet, ist recht gering.

Imre Greilich
quelle
45
Anstelle des Unintuitiven chr(38)können Sie tunnode_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan
1
Beachten Sie chr(38), dass andere arme, verwirrte Seelen für mich nicht so sind char(38) .
xdhmoore
Beachten Sie, dass &dies in MySQL nicht maskiert werden muss. Auch MySQL hat die Funktion nicht CHR().
Asmaier
113

Escape ist \standardmäßig eingestellt , sodass Sie es nicht einstellen müssen. Wenn Sie dies jedoch tun, setzen Sie es nicht in Anführungszeichen.

Das kaufmännische Und ist der SQL * Plus- Substitutionsvariablenmarker . Sie können es jedoch ändern oder in Ihrem Fall sinnvoller vollständig ausschalten, mit:

set define off

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

Alex Poole
quelle
2
Das Escape- Zeichen ist \ standardmäßig aktiviert, der boolesche Parameter escapeist jedoch standardmäßig auf OFF gesetzt. Das OP muss also möglicherweise nicht den Escape-Charakter festlegen, aber er / sie muss zumindest SET ESCAPE ON, damit dies funktioniert. Oder verwenden Sie natürlich eine der anderen, besseren Lösungen.
Mathguy
46

Sie können verwenden

set define off

Wenn Sie dies verwenden, werden Sie nicht zur Eingabe aufgefordert

Ankur
quelle
32

direkt aus dem Oracle SQL Fundamentals Book

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

wie würde man ihm entkommen, ohne zu definieren.

römisch
quelle
2
Das Hinzufügen von SET DEFINE ON ist hilfreich.
KSev
@Roman Ohne Definition können Sie auch Folgendes verwenden: Wählen Sie 'Coda' '&' 'Sid' aus dual; (doppelte einfache Anführungszeichen)
Antcalvente
8

Um zu entkommen &, können Sie folgende Möglichkeiten ausprobieren: -

  1. set scan off
  2. set define off
  3. set escape on dann ersetzen &durch/&
  4. ersetzen &durch&&

Einer von ihnen sollte mindestens arbeiten.

Ein ußerdem , wenn Sie mit PL / SQL - Entwickler dann gibt es & Symbol im unteren Teil der SQL - Fenster bitte dorthin gehen und deaktivieren Sie es . Beachten Sie, dass diese Option in älteren Versionen nicht vorhanden ist.

Stellen Sie außerdem sicher, dass set define off ganz am Anfang des Skripts geschrieben ist.

Ein Verbraucher
quelle
2

Das funktioniert auch:

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

Sie definieren &als Literal, indem Sie doppelte Zeichenfolgen "&"in die Zeichenfolge einschließen .

Copmac
quelle
1
Wenn Sie das tun, werden die doppelten Anführungszeichen Teil der Zeichenfolge, wie A3D"&"R01
folgt
2
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

oder alternativ:

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

Mit dem ersten können Sie den Backslash verwenden, um dem & zu entkommen.

Die zweite Option wird deaktiviert und "global" (es ist nicht erforderlich, irgendwo einen Backslash hinzuzufügen). Sie können es wieder einschalten, set define onund ab dieser Zeile erhalten die kaufmännischen Und-Zeichen ihre spezielle Bedeutung zurück, sodass Sie es für einige Teile des Skripts und nicht für andere deaktivieren können.

David Balažic
quelle
0
REPLACE(<your xml column>,'&',chr(38)||'amp;')
user6385350
quelle
0

Ich habe einen regulären Ausdruck geschrieben, um "&" in einem INSERT zu finden und zu ersetzen. Ich hoffe, dass dies jemandem hilft.

Der Trick bestand darin, sicherzustellen, dass das "&" mit anderem Text übereinstimmt.

Finden “(\'[^\']*(?=\&))(\&)([^\']*\')”

Ersetzen “$1' || chr(38) || '$3”

that_roy
quelle