É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.


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

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.


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.


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


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.


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.


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.


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.



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”

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.