Échapper au caractère ampersand dans la chaîne SQL

j'essaie d'interroger une certaine ligne par son nom dans ma base de données sql et elle a un ampli. J'ai essayé de mettre un caractère d'échappement, puis à s'échapper de l'esperluette, mais pour une raison quelconque, cela ne fonctionne pas et je suis incertain sur ce qu'est exactement mon problème.

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);

bien que cela ait une solution similaire à cette question , les problèmes sont posés très différemment. Ils peuvent finir par avoir la même solution, mais cela ne signifie pas que l' les questions sont les mêmes.

90
demandé sur Community 2012-10-18 22:23:10

7 réponses

au lieu de

node_name = 'Geometric Vectors \& Matrices'

utiliser

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

38 est le code ascii pour ampersand, et dans cette forme il sera interprété comme une chaîne, rien d'autre. Je l'ai essayé et cela a fonctionné.

une autre façon pourrait être d'utiliser comme et un soulignement à la place le caractère'&':

node_name LIKE 'Geometric Vectors _ Matrices' 

la chance que vous trouverez un autre disque aussi, qui est différent dans ce seul caractère, est tout à fait faible.

145
répondu Imre Greilich 2012-10-18 18:42:37

"151930920 d'Évasion" est réglé sur \ par défaut , de sorte que vous n'avez pas besoin de le définir; mais si vous le faites, ne pas envelopper dans des guillemets.

Esperluette est le SQL*Plus de la variable de substitution marqueur; mais vous pouvez modifier , ou de façon plus utile dans votre cas, l'éteindre complètement, avec:

set define off

alors vous n'avez pas besoin de prendre la peine d'échapper à la valeur du tout.

85
répondu Alex Poole 2012-10-18 18:33:55

vous pouvez utiliser

set define off

L'utilisation de cette il ne sera pas invite pour l'entrée

32
répondu Ankur 2012-10-18 18:27:18

directement d'oracle SQL fundamentals book

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

comment pourrait-on lui échapper sans définir le cadre.

23
répondu Roman 2013-12-05 19:53:33
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

ou alternativement:

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

le premier vous permet d'utiliser le backslash pour échapper au &.

Le deuxième s'éteint et "globalement" (pas besoin d'ajouter une barre oblique inverse n'importe où). Vous pouvez l'allumer de nouveau par set define on et à partir de cette ligne sur les ampersands récupéreront leur signification spéciale, de sorte que vous pouvez l'éteindre pour certaines parties du script et pas pour d'autres.

1
répondu David Balažic 2018-06-14 14:04:18
REPLACE(<your xml column>,'&',chr(38)||'amp;')
0
répondu user6385350 2016-05-26 10:31:02

Cela fonctionne ainsi:

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

vous définissez & comme littéral en enfermant est avec double qoutes "&" dans la chaîne.

0
répondu copmac 2017-02-08 13:40:40