web-dev-qa-db-fra.com

Échappement du caractère esperluette dans une chaîne SQL

J'essaie d'interroger une certaine ligne par nom dans ma base de données SQL et il a une esperluette. J'ai essayé de définir un caractère d'échappement, puis d'échapper à l'esperluette, mais pour une raison quelconque, cela ne fonctionne pas et je ne sais pas quel 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 apporte une solution similaire à cette question , les problèmes se posent très différemment. Ils peuvent finir par avoir la même solution, mais cela ne signifie pas que les questions sont les mêmes.

106
Slater Victoroff

Au lieu de 

node_name = 'Geometric Vectors \& Matrices'

utilisation 

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

38 est le code ascii pour esperluette, et sous 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 LIKE et de souligner le caractère '&' à la place: 

node_name LIKE 'Geometric Vectors _ Matrices' 

La chance que vous trouviez un autre disque aussi, qui est différent dans ce seul caractère, est assez faible. 

165
Imre Greilich

Escape est défini sur \ par défaut , vous n'avez donc pas besoin de le définir; mais si vous le faites, ne le mettez pas entre guillemets.

Esperluette est le marqueur SQL * Plus variable de substitution ; mais vous pouvez le changer , ou plus utilement dans votre cas, l'éteindre complètement avec:

set define off

Dans ce cas, vous n'avez pas besoin de vous soucier d'échapper à la valeur.

92
Alex Poole

Vous pouvez utiliser

set define off

En utilisant cela, il ne sera pas demandé pour l'entrée

36
Ankur

directement à partir du livre Oracle sql Fundamentals 

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

comment pourrait-on y échapper sans définir.

25
Roman

Pour échapper à &, vous pouvez essayer les méthodes suivantes: -

  1. set scan off
  2. set define off
  3. set escape on puis remplacez & par /&
  4. remplacer & par &&

L'un d'entre eux devrait travailler au moins.

ASi vous utilisez un développeur PL/SQL, il y a alors & icône en bas de la fenêtre SQL, veuillez y aller et désactiver il. Notez que dans l’ancienne version, cette option n’est pas présente.

Assurez-vous également que set define est écrit au tout début du script. 

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

ou bien:

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

La première vous permet d’utiliser la barre oblique inverse pour échapper au &.

La seconde est désactivée et "globalement" (inutile d'ajouter une barre oblique inverse n'importe où). Vous pouvez le réactiver avec set define on et cette ligne des esperluettes retrouvera leur signification particulière. Vous pourrez donc le désactiver pour certaines parties du script et pas pour d'autres.

1
David Balažic

Cela fonctionne aussi bien:

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

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

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