Escapando o caractere e comercial na string SQL

143

Estou tentando consultar uma determinada linha pelo nome no meu banco de dados sql e ele tem um e comercial. Tentei definir um caractere de escape e depois escapar do e comercial, mas por algum motivo isso não está funcionando e não tenho certeza sobre qual é exatamente o meu 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);

Embora isso tenha uma solução semelhante a essa pergunta , os problemas são colocados de maneira muito diferente. Eles podem acabar tendo a mesma solução, mas isso não significa que as perguntas sejam as mesmas.

Slater Victoroff
fonte
Eu não acho que você precisa a citação em torno do escape ( '\') personagem
mcalex
29
set define offé a maneira mais simples de fazer isso.
AnBisw 18/10/12
1
Duplicado de stackoverflow.com/questions/118190/…
oliver-clare 15/06

Respostas:

205

Ao invés de

node_name = 'Geometric Vectors \& Matrices'

usar

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

38 é o código ascii para e comercial e, dessa forma, será interpretado como uma sequência, nada mais. Eu tentei e funcionou.

Outra maneira poderia ser usar LIKE e um sublinhado, em vez do caractere '&':

node_name LIKE 'Geometric Vectors _ Matrices' 

A chance de você encontrar outro disco também, que é diferente apenas nesse personagem, é bastante baixa.

Imre Greilich
fonte
45
Em vez da intuitiva chr(38), você pode fazernode_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan
1
Para outras almas confusas pobres iguais a mim mesmo, nota que é chr(38), não char(38) .
Xdhmoore 29/08/19
Note que &não precisa ser escapado no MySQL. Além disso, o MySQL não tem a função CHR().
asmaier 18/06
113

Escape está definido como \padrão , portanto você não precisa defini-lo; mas se o fizer, não o coloque entre aspas.

E comercial é o marcador de variável de substituição do SQL * Plus ; mas você pode alterá-lo ou, mais útil, no seu caso, desativá-lo completamente, com:

set define off

Então você não precisa se preocupar em escapar do valor.

Alex Poole
fonte
2
O caractere de escape está definido como \ padrão, mas o parâmetro booleano escapeestá definido como OFF por padrão. Portanto, o OP pode não precisar definir o caractere de escape, mas ele precisa pelo menos SET ESCAPE ONpara que isso funcione. Ou, é claro, use qualquer uma das outras soluções melhores.
mathguy
46

Você pode usar

set define off

Usando isso, não solicitará a entrada

Ankur
fonte
32

direto do livro de fundamentos oracle sql

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

como alguém escaparia sem definir definir.

romano
fonte
2
A adição de SET DEFINE ON é útil.
KSev 21/02
@ Roman Sem definir, você também pode usar: selecione 'Coda' 'e' 'Sid' de dual; (aspas simples e duplas)
antcalvente 04/07/19
8

Para escapar, &você pode tentar as seguintes maneiras: -

  1. set scan off
  2. set define off
  3. set escape on substitua &por/&
  4. substituir &por&&

Um deles deve trabalhar pelo menos.

A dditionally se você estiver usando desenvolvedor PL / SQL, então há & ícone na parte inferior da janela sql por favor, vá lá e desativar ele . Observe que na versão anterior esta opção não está presente.

Certifique-se também de que set define off esteja gravado no início do script.

AConsumidor
fonte
2

Isso também funciona:

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

você define &como literal colocando-o com qoutes duplos "&"na cadeia.

copmac
fonte
1
Se você fizer isso, as aspas duplas se tornarão parte da cadeia de caracteres, assim:A3D"&"R01
David Balažic
2
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

ou alternativamente:

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

O primeiro permite que você use a barra invertida para escapar do &.

O segundo desliga e "globalmente" (não é necessário adicionar uma barra invertida em nenhum lugar). Você pode ativá-lo novamente set define one a partir dessa linha, o e comercial terá seu significado especial de volta; portanto, você pode desativá-lo em algumas partes do script e não em outras.

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

Eu escrevi um regex para ajudar a encontrar e substituir "&" dentro de um INSERT, espero que isso ajude alguém.

O truque era garantir que o "&" estivesse com outro texto.

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

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

that_roy
fonte