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.
set define off
ist der einfachste Weg, dies zu tun.Antworten:
Anstatt
verwenden
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:
Die Wahrscheinlichkeit, dass Sie auch einen anderen Datensatz finden, der sich nur in diesem einen Charakter unterscheidet, ist recht gering.
quelle
chr(38)
können Sie tunnode_name = 'Geometric Vectors &' || ' Matrices'
chr(38)
, dass andere arme, verwirrte Seelen für mich nicht so sindchar(38)
.&
dies in MySQL nicht maskiert werden muss. Auch MySQL hat die Funktion nichtCHR()
.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:
Dann müssen Sie sich überhaupt nicht die Mühe machen, dem Wert zu entkommen.
quelle
\
standardmäßig aktiviert, der boolesche Parameterescape
ist jedoch standardmäßig auf OFF gesetzt. Das OP muss also möglicherweise nicht den Escape-Charakter festlegen, aber er / sie muss zumindestSET ESCAPE ON
, damit dies funktioniert. Oder verwenden Sie natürlich eine der anderen, besseren Lösungen.Sie können verwenden
Wenn Sie dies verwenden, werden Sie nicht zur Eingabe aufgefordert
quelle
direkt aus dem Oracle SQL Fundamentals Book
wie würde man ihm entkommen, ohne zu definieren.
quelle
Um zu entkommen
&
, können Sie folgende Möglichkeiten ausprobieren: -set scan off
set define off
set escape on
dann ersetzen&
durch/&
&
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.
quelle
Das funktioniert auch:
select * from mde_product where cfn = 'A3D"&"R01'
Sie definieren
&
als Literal, indem Sie doppelte Zeichenfolgen"&"
in die Zeichenfolge einschließen .quelle
A3D"&"R01
oder alternativ:
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 on
und 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.quelle
quelle
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”
quelle