2012-10-18 22 views
79

Sto provando a 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 scappare dalla e commerciale, ma per qualche motivo questo non funziona e sono incerto su quale sia esattamente il mio problema.Escaping carattere e commerciale in stringa SQL

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

Anche se questo ha una soluzione simile a this question, i problemi sono poste in modo molto diverso. Possono finire per avere la stessa soluzione, ma ciò non significa che le domande siano le stesse.

+0

Non credo che sia necessario il preventivo attorno al carattere di escape ('\') – mcalex

+17

'set define off' è il modo più semplice per farlo. – Annjawn

+1

Duplicato di http://stackoverflow.com/questions/118190/how-do-i-ignore-ampersands-in-a-sql-script-running-from-sql-plus – LordScree

risposta

124

Invece di

node_name = 'Geometric Vectors \& Matrices' 

uso

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

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

Un altro modo potrebbe essere utilizzando LIKE e una sottolineatura al posto del '&' carattere:

node_name LIKE 'Geometric Vectors _ Matrices' 

La possibilità che troverete qualche altro record di troppo, che è diverso in solo questo personaggio, è abbastanza Basso.

+28

Invece dell'intuitivo 'chr (38)', puoi fare 'node_name = 'Vettori geometrici &' || "Matrici" –

27

È possibile utilizzare

set define off 

Usando questo non verrà richiesto per l'ingresso

81

Escape is set to \ by default, quindi non è necessario impostarlo; ma se lo fai, non avvolgerlo tra virgolette.

Ampersand è il marcatore SQL * Plus substitution variable; ma è possibile change it, o più utilmente nel tuo caso spegnerlo completamente, con:

set define off 

Allora non c'è bisogno di preoccuparsi di sfuggire il valore a tutti.

+0

Completamente d'accordo! – Annjawn

+1

Il carattere * di escape * è impostato su '\' di default, ma il parametro booleano 'escape' è impostato su OFF di default. Quindi l'OP potrebbe non aver bisogno di impostare il carattere di escape, ma lui/lei deve almeno "SET ESCAPE ON" affinché funzioni. O, naturalmente, utilizzare una delle altre soluzioni migliori. – mathguy

19

retta dalla Oracle fondamentali di SQL libro

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

come sarebbe uno sfuggire senza impostare definire.

+2

L'aggiunta di SET DEFINE ON è utile. – KSev

0
REPLACE(<your xml column>,'&',chr(38)||'amp;') 
0

questo funziona così:

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

si definiscono & letterale racchiudendo è con doppi qoutes "&" nella stringa.

+0

Se lo fai, le virgolette diventeranno parte della stringa, come questa: "A3D" e "R01' –

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

o in alternativa:

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

La prima consente di utilizzare la barra rovesciata per sfuggire alla &.

Il secondo spegne & "globalmente" (non è necessario aggiungere una barra rovesciata ovunque). Puoi riaccenderlo di nuovo da set define off e da quella linea sulla e commerciale la parola tornerà al loro significato speciale, quindi puoi disattivarla per alcune parti dello script e non per gli altri.