2012-10-18 42 views
79

SQLデータベースで特定の行を名前でクエリしようとしていますが、アンパサンドがあります。私はエスケープ文字を設定してアンパサンドをエスケープしようとしましたが、何らかの理由でこれが機能していないため、私の問題が正確に何であるかは不明です。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); 

これはthis questionに同様のソリューションを持っているが、問題は非常に異なって提起されています。彼らは同じ解決策を持つことになるかもしれませんが、それは質問が同じであることを意味しません。

+0

エスケープ文字( '\')を引用符で囲む必要はありません – mcalex

+17

'set define off'はそれを行う最も簡単な方法です。 – Annjawn

+1

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

答えて

124

はアンパサンドのASCIIコードであり、この形式では、文字列、何もないと解釈されます。私はそれを試して、それは働いた。

node_name LIKE 'Geometric Vectors _ Matrices' 

あなたがこれだけの文字で異なっている、あまりにも他のいくつかのレコードを見つけることのチャンスはかなりある:

もう一つの方法は「&」文字の代わりにLIKEおよび下線を使用することができ低い。

+28

直感的ではない 'chr(38)'の代わりに、 'node_name = '幾何学ベクトル&' || Matrices' –

27

あなたは、あなたがそれを設定する必要はありませんので、これは、それは、入力

81

Escape is set to \ by defaultのプロンプトを表示しません使用

set define off 

を使用することができます。しかし、そうした場合は、引用符で囲んではいけません。

アンパサンドはSQL * Plus substitution variableマーカーです。そして、あなたがすべてで値をエスケープ気にする必要はありません

set define off 

:しかし、あなたはあなたのケースではchange it、またはそれ以上の有効にして、それを完全にオフにすることができます。代わりに

node_name = 'Geometric Vectors \& Matrices' 

使用

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

38の

+0

完全に同意してください! – Annjawn

+1

エスケープ文字*はデフォルトで '\'に設定されていますが、ブール型パラメータ 'escape'はデフォルトでOFFに設定されています。したがって、OPはエスケープ文字を設定する必要はないかもしれませんが、動作させるには少なくともSET ESCAPE ONを必要とします。もちろん、他のより良いソリューションを使用することもできます。 – mathguy

19

ストレートのOracle SQLの基礎帳から

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

方法1定義設定せずに、それをエスケープします。

+2

SET DEFINE ONを追加すると便利です。 – KSev

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

これは、同様に動作します

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

リテラルとして&を定義囲むことによっては、文字列内のダブルクォート"&"です。

+0

これを行うと、二重引用符は次のように文字列の一部になります: 'A3D"& "R01' –

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

または代わり:

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

最初は、あなたが&をエスケープするバックスラッシュを使用することができます。

&を「グローバルに」オフにします(どこにでもバックスラッシュを追加する必要はありません)。 set define offによって再度オンにすることができ、アンパサンドのその行から特殊な意味が戻ってくるので、スクリプトの一部ではオフにし、他の部分ではオフにすることができます。