SQL文字列でのアンパサンド文字のエスケープ


143

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

これはこの質問と同様の解決策がありますが、問題の提起方法は大きく異なります。彼らは同じ解決策を持つことになるかもしれませんが、それは質問が同じであることを意味しません。


エスケープ( '\')文字を
囲む

29
set define offそれを行う最も簡単な方法です。
AnBisw 2012年

回答:


205

の代わりに

node_name = 'Geometric Vectors \& Matrices'

使用する

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

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

別の方法として、「&」文字の代わりにLIKEと下線を使用することもできます。

node_name LIKE 'Geometric Vectors _ Matrices' 

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


45
直感的ではなくchr(38)、次のことができますnode_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan

1
私と同じように他の貧しい混乱した魂のために、それがそうchr(38)はない ことに注意してくださいchar(38)
xdhmoore

&MySQLではエスケープする必要がないことに注意してください。また、MySQLには関数がありませんCHR()
asmaier

113

脱出に設定され\、デフォルトでは、あなたがそれを設定する必要はありませんので、。ただし、その場合は引用符で囲まないでください。

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

set define off

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


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


32

オラクルSQLの基本的な本から直接

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

defineを設定せずにそれをどのようにエスケープするか。


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

@Roman定義なしでも使用できます。デュアルから「Coda ''& '' Sid」を選択します。(二重引用符)
antcalvente

8

脱出&するには、次の方法を試すことができます:-

  1. set scan off
  2. set define off
  3. set escape on その後、交換する&ことにより、/&
  4. 置き換える&ことにより、&&

それらの1つは少なくとも動作するはずです。

加えて、PL / SQL開発者を使用している場合、SQLウィンドウの下部に&アイコンがありますそこに移動して無効にしください。古いバージョンでは、このオプションは存在しないことに注意してください。

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


2

これも機能します:

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

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


1
:あなたがそれを行う場合は、二重引用符は、このように、文字列の一部となりますA3D"&"R01
デヴィッドBalažic

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

または代わりに:

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

1つ目では、円記号を使用して&をエスケープできます。

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



0

私はINSERT内の「&」を見つけて置き換えるのに役立つ正規表現を書きました。これが誰かの役に立つことを願っています。

トリックは、「&」が他のテキストと一緒にあることを確認することでした。

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

交換する “$1' || chr(38) || '$3”

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.