174 votes

Échapper au caractère esperluette dans une chaîne SQL

J'essaie d'interroger une certaine ligne par son nom dans ma base de données sql et elle contient 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 exactement quel est 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 cette solution soit similaire à cette question les problèmes sont posés de manière très différente. Ils peuvent finir par avoir la même solution, mais cela ne signifie pas que les questions sont les mêmes.

258voto

Imre Greilich Points 3102

Au lieu de

node_name = 'Geometric Vectors \& Matrices'

utiliser

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

38 est le code ascii de l'esperluette, et sous cette forme, il sera interprété comme une chaîne de caractères, rien d'autre. J'ai essayé et ça a marché.

Une autre solution consiste à utiliser le caractère LIKE et un soulignement à la place du caractère "&" :

node_name LIKE 'Geometric Vectors _ Matrices' 

La probabilité que vous trouviez également un autre enregistrement, qui n'est différent que dans ce seul caractère, est assez faible.

133voto

Alex Poole Points 43006

Escape est réglé 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.

L'esperluette est le code SQL*Plus variable de substitution marqueur ; mais vous pouvez le changer ou, plus utilement dans votre cas, le désactiver complètement, avec :

set define off

Dans ce cas, vous n'avez pas besoin de vous soucier de l'échappement de la valeur.

52voto

Ankur Points 4371

Vous pouvez utiliser

set define off

En utilisant ceci, il n'y aura pas de demande de saisie.

36voto

Roman Points 369

Tout droit sorti du livre oracle sql fundamentals

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

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

15voto

Shivendra Gupta Points 378

Afin d'échapper & vous pouvez essayer les méthodes suivantes:-

  1. set scan off
  2. set define off
  3. set escape on Alors remplacez & par \&
  4. remplacer & par &&

L'un d'eux devrait au moins fonctionner.

En outre, si vous utilisez PL/SQL developer, il y a &. 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 off est écrit au tout début du script.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X