Carattere e commerciale di escape nella stringa SQL


143

Sto cercando di interrogare una determinata riga per nome nel mio database sql e ha una e commerciale. Ho provato a impostare un carattere di escape e quindi a fuggire dalla e commerciale, ma per qualche motivo questo non funziona e non sono sicuro di quale sia esattamente il mio 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);

Sebbene questa abbia una soluzione simile a questa domanda , i problemi sono posti in modo molto diverso. Potrebbero finire per avere la stessa soluzione, ma ciò non significa che le domande siano le stesse.


non credo che tu abbia bisogno della citazione intorno al personaggio escape ('\')
mcalex,

29
set define offè il modo più semplice per farlo.
AnBisw,

Risposte:


205

Invece di

node_name = 'Geometric Vectors \& Matrices'

uso

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

38 è il codice ascii per la e commerciale, e in questa forma verrà interpretato come una stringa, nient'altro. L'ho provato e ha funzionato.

Un altro modo potrebbe essere LIKE e una sottolineatura invece del carattere '&':

node_name LIKE 'Geometric Vectors _ Matrices' 

La possibilità che troverai anche qualche altro disco, che è diverso solo in questo personaggio, è piuttosto bassa.


45
Invece di un non intuitivo chr(38), puoi farlonode_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan,

1
Per le altre povere anime confuse simili a me stesso, nota che è chr(38), non è char(38) .
xdhmoore,

Nota che &non è necessario eseguire l'escape in MySQL. Anche MySQL non ha la funzione CHR().
asmaier

113

Escape è impostato di \default , quindi non è necessario impostarlo; ma se lo fai, non racchiuderlo tra virgolette.

La e commerciale è il marcatore della variabile di sostituzione SQL * Plus ; ma puoi cambiarlo , o più utilmente nel tuo caso spegnerlo completamente, con:

set define off

Quindi non devi preoccuparti di sfuggire al valore.


2
Il carattere di escape è impostato di \ default, ma il parametro booleano escapeè impostato su OFF di default. Quindi l'OP potrebbe non aver bisogno di impostare il carattere di fuga, ma deve almeno SET ESCAPE ONfarlo funzionare. O, ovviamente, usa una delle altre soluzioni migliori.
Mathguy,

46

Puoi usare

set define off

Usando questo non richiederà l'input


32

direttamente dal libro dei fondamentali di Oracle sql

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

come si eviterebbe senza definire l'impostazione.


2
L'aggiunta di SET DEFINE ON è utile.
Kev

@Roman Senza definizione puoi usare anche: seleziona 'Coda' '&' 'Sid' dal doppio; (doppie virgolette singole)
antcalvente

8

Per scappare &puoi provare i seguenti modi: -

  1. set scan off
  2. set define off
  3. set escape on quindi sostituire &con/&
  4. sostituire &con&&

Uno di loro dovrebbe funzionare almeno.

Un dditionally se si utilizza sviluppatore PL / SQL allora non c'è e l'icona nella parte inferiore della finestra SQL si prega di andare lì e disabilitare esso . Nota nella versione precedente questa opzione non è presente.

Assicurati anche che set define off off sia scritto all'inizio dello script.


2

Funziona anche così:

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

si definisce &letterale racchiudendo è con doppi qout "&"nella stringa.


1
Se lo fai, le doppie virgolette diventeranno parte della stringa, in questo modo:A3D"&"R01
David Balažic,

2
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

o in alternativa:

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

Il primo ti permette di usare la barra rovesciata per sfuggire al &.

Il secondo si spegne e "a livello globale" (non è necessario aggiungere una barra rovesciata da nessuna parte). Puoi riattivarlo da set define one da quella linea in poi le e commerciali avranno il loro significato speciale, quindi puoi disattivarlo per alcune parti dello script e non per altre.



0

Ho scritto una regex per aiutare a trovare e sostituire "&" all'interno di un INSERT, spero che questo aiuti qualcuno.

Il trucco era assicurarsi che il "&" fosse con altro testo.

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.