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.
set define off
Es la forma más sencilla de hacerlo.Respuestas:
En vez de
utilizar
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 '&':
La posibilidad de que encuentres algún otro registro también, que es diferente solo en este personaje, es bastante baja.
fuente
chr(38)
, puedes hacerlonode_name = 'Geometric Vectors &' || ' Matrices'
chr(38)
, nochar(38)
.&
no es necesario escapar en MySQL. También MySQL no tiene la funciónCHR()
.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:
Entonces no necesita molestarse en escapar del valor en absoluto.
fuente
\
de forma predeterminada, pero el parámetro booleanoescape
está desactivado de forma predeterminada. Por lo tanto, es posible que el OP no necesite establecer el carácter de escape, pero al menos debe hacerloSET ESCAPE ON
para que eso funcione. O, por supuesto, use cualquiera de las otras soluciones mejores.Puedes usar
Al usar esto, no solicitará la entrada
fuente
directamente del libro de fundamentos de Oracle SQL
¿Cómo se podría escapar sin definir?
fuente
Para escapar
&
, puede intentar las siguientes formas:set scan off
set define off
set escape on
luego reemplazar&
por/&
&
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.
fuente
Esto también funciona:
select * from mde_product where cfn = 'A3D"&"R01'
define
&
como literal al encerrar es con dobles qoutes"&"
en la cadena.fuente
A3D"&"R01
o alternativamente:
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 on
partir 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.fuente
fuente
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”
fuente