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

143

J'essaye d'interroger une certaine ligne par nom dans ma base de données SQL et elle 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 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 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 veut pas dire que les questions sont les mêmes.

Slater Victoroff
la source
Je ne pense pas que vous ayez besoin de la citation autour du caractère d'échappement ('\')
mcalex
29
set define offest le moyen le plus simple de le faire.
AnBisw
1
Duplicate of stackoverflow.com/questions/118190/…
oliver-clare

Réponses:

205

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 un soulignement à la place du caractère '&':

node_name LIKE 'Geometric Vectors _ Matrices' 

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

Imre Greilich
la source
45
Au lieu de l'intuition chr(38), vous pouvez le fairenode_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan
1
Pour d' autres pauvres âmes confuses aussi bien à moi - même, note qu'il est chr(38), non char(38) .
xdhmoore
Notez que cela &n'a pas besoin d'être échappé dans MySQL. MySQL n'a pas non plus la fonction CHR().
asmaier
113

Escape est défini \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 de variable de substitution SQL * Plus ; mais vous pouvez le changer , ou plus utilement dans votre cas le désactiver complètement, avec:

set define off

Ensuite, vous n'avez pas du tout besoin d'échapper à la valeur.

Alex Poole
la source
2
Le caractère d' échappement est défini sur \ par défaut, mais le paramètre booléen escapeest défini sur OFF par défaut. Ainsi, l'OP n'a peut-être pas besoin de définir le caractère d'échappement, mais il / elle en a au moins besoin SET ESCAPE ONpour que cela fonctionne. Ou, bien sûr, utilisez l'une des autres solutions meilleures.
mathguy
46

Vous pouvez utiliser

set define off

En utilisant cela, il ne demandera pas l'entrée

Ankur
la source
32

directement à partir du livre sur les principes de base d'Oracle SQL

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

comment y échapper sans définir de réglage.

romain
la source
2
L'ajout de SET DEFINE ON est utile.
KSev
@Roman Sans définir, vous pouvez également utiliser: sélectionnez 'Coda' '&' 'Sid' dans dual; (guillemets doubles)
antcalvente
8

Pour &vous échapper, vous pouvez essayer les moyens suivants: -

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

L'un d'eux devrait fonctionner au moins.

A n outre , si vous utilisez développeur PL / SQL puis il y a et icône en bas de la fenêtre sql s'il vous plaît allez - y et désactiver ce . 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.

Un consommateur
la source
2

Cela fonctionne également:

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

vous définissez &comme littéral en englobant est avec des doubles qoutes "&"dans la chaîne.

copmac
la source
1
Si vous faites cela, les guillemets doubles feront partie de la chaîne, comme ceci:A3D"&"R01
David Balažic
2
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

Ou bien:

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

Le premier vous permet d'utiliser la barre oblique inverse pour échapper au &.

Le second s'éteint & "globalement" (pas besoin d'ajouter une barre oblique inverse n'importe où). Vous pouvez le réactiver à set define onpartir de cette ligne et les esperluettes retrouveront leur signification particulière, vous pouvez donc la désactiver pour certaines parties du script et pas pour d'autres.

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

J'ai écrit une regex pour aider à trouver et remplacer "&" dans un INSERT, j'espère que cela aide quelqu'un.

L'astuce était de s'assurer que le "&" était avec un autre texte.

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

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

ça_roy
la source