web-dev-qa-db-ja.com

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

これは この質問 に似た解決策を持っていますが、問題は非常に異なって提起されています。彼らは同じ解決策を持つことになるかもしれませんが、それは質問が同じであることを意味するのではありません。

114

の代わりに

node_name = 'Geometric Vectors \& Matrices'

つかいます

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

38はアンパサンドのASCIIコードで、この形式では文字列として解釈されます。試してみましたが、うまくいきました。

もう1つの方法は、LIKEとアンダーラインを代わりに使用することです。

node_name LIKE 'Geometric Vectors _ Matrices' 

この1文字だけが異なる他のレコードも見つける可能性は非常に低いです。

171
Imre Greilich

エスケープはデフォルトで\に設定されています ですので、設定する必要はありません。しかし、もしそうなら、それを引用符で囲まないでください。

アンパサンドはSQL * Plus 置換変数 マーカーです。しかし、あなたは それを変更する 、あるいはもっと便利には完全にそれをオフにすることができます。

set define off

そうすれば、値をエスケープする必要はまったくありません。

95
Alex Poole

あなたが使用することができます

set define off

これを使っても入力を促さない

38
Ankur

oracleのSQLの基本の本から直接

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

defineを設定せずにどうやってそれをエスケープするのでしょう。

26
Roman

&をエスケープするには、以下の方法を試してください。 -

  1. set scan off
  2. set define off
  3. set escape on&/&に置き換えます
  4. &&&に置き換えます

そのうちの1人は少なくとも動くはずです。

A 従来PL/SQL開発者を使用している場合は、SQLウィンドウの下部に&アイコンがあり、そこに移動して無効にしてくださいそれ。旧バージョンでは、このオプションは存在しません。

また、set define offがスクリプトの最初に書かれていることを確認してください。

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

あるいは、

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

最初の例ではバックスラッシュを使って&をエスケープすることができます。

2番目はオフになり、「グローバルに」(どこにもバックスラッシュを追加する必要はありません)。 set define onでそれを再びオンにすることができ、アンパサンド上のその行からそれらの特別な意味が取り戻されるので、スクリプトの一部ではなく他ではオフにすることができます。

1
David Balažic

これも同様に機能します。

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

&をリ​​テラルとして定義するには、文字列内に"&"の二重引用符を付けます。

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