Escapar de un carácter comercial en cadena SQL

143

Estoy tratando de consultar una determinada fila por nombre en mi base de datos SQL y tiene un ampersand. Traté de establecer un personaje de escape y luego escapar del signo y, pero por alguna razón esto no funciona y no estoy seguro de cuál es exactamente mi problema.

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

Aunque esto tiene una solución similar a esta pregunta , los problemas se plantean de manera muy diferente. Pueden terminar teniendo la misma solución, pero eso no significa que las preguntas sean las mismas.

Slater Victoroff
fuente
no creo que necesites la cita alrededor del personaje de escape ('\')
mcalex
29
set define offEs la forma más sencilla de hacerlo.
AnBisw
1
Duplicado de stackoverflow.com/questions/118190/…
oliver-clare

Respuestas:

205

En vez de

node_name = 'Geometric Vectors \& Matrices'

utilizar

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

38 es el código ascii para ampersand, y de esta forma se interpretará como una cadena, nada más. Lo intenté y funcionó.

Otra forma podría ser usar LIKE y un subrayado en lugar del carácter '&':

node_name LIKE 'Geometric Vectors _ Matrices' 

La posibilidad de que encuentres algún otro registro también, que es diferente solo en este personaje, es bastante baja.

Imre Greilich
fuente
45
En lugar de lo poco intuitivo chr(38), puedes hacerlonode_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan
1
Para otras almas confundidas pobres por igual a mí mismo, tenga en cuenta que se trata chr(38), no char(38) .
xdhmoore
Tenga en cuenta que &no es necesario escapar en MySQL. También MySQL no tiene la función CHR().
asmaier
113

Escape está configurado \de forma predeterminada , por lo que no necesita configurarlo; pero si lo hace, no lo envuelva entre comillas.

Ampersand es el marcador de variable de sustitución SQL * Plus ; pero puede cambiarlo , o más útilmente en su caso, apáguelo completamente, con:

set define off

Entonces no necesita molestarse en escapar del valor en absoluto.

Alex Poole
fuente
2
El carácter de escape está configurado \ de forma predeterminada, pero el parámetro booleano escapeestá desactivado de forma predeterminada. Por lo tanto, es posible que el OP no necesite establecer el carácter de escape, pero al menos debe hacerlo SET ESCAPE ONpara que eso funcione. O, por supuesto, use cualquiera de las otras soluciones mejores.
Mathguy
46

Puedes usar

set define off

Al usar esto, no solicitará la entrada

Ankur
fuente
32

directamente del libro de fundamentos de Oracle SQL

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

¿Cómo se podría escapar sin definir?

romano
fuente
2
La adición de SET DEFINE ON es útil.
KSev
@Roman Sin definir también podría usarlo: seleccione 'Coda' 'y' 'Sid' de dual; (comillas simples)
antcalvente
8

Para escapar &, puede intentar las siguientes formas:

  1. set scan off
  2. set define off
  3. set escape on luego reemplazar &por/&
  4. reemplazar &por&&

Uno de ellos debería trabajar al menos.

A dicionalmente si está utilizando desarrollador PL / SQL y entonces no hay icono en la parte inferior de la ventana SQL favor ir allí y desactivar que . Tenga en cuenta que en la versión anterior esta opción no está presente.

También asegúrese de que set define off esté escrito al comienzo del script.

Un consumidor
fuente
2

Esto también funciona:

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

define &como literal al encerrar es con dobles qoutes "&"en la cadena.

copmac
fuente
1
Si haces eso, las comillas dobles se convertirán en parte de la cadena, así:A3D"&"R01
David Balažic
2
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

o alternativamente:

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

El primero le permite usar la barra invertida para escapar del &.

El segundo se apaga y "globalmente" (no es necesario agregar una barra diagonal inversa en ninguna parte). Puede activarlo nuevamente a set define onpartir de esa línea y los símbolos de signo recuperarán su significado especial, por lo que puede desactivarlo para algunas partes del guión y no para otras.

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

Escribí una expresión regular para ayudar a encontrar y reemplazar "&" dentro de un INSERT, espero que esto ayude a alguien.

El truco consistía en asegurarse de que el "&" estuviera con otro texto.

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

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

que_roy
fuente