169

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

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

4

11 に答える 11

245

それ以外の

node_name = 'Geometric Vectors \& Matrices'

使用する

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

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

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

node_name LIKE 'Geometric Vectors _ Matrices' 

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

于 2012-10-18T18:42:37.883 に答える
131

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

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

set define off

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

于 2012-10-18T18:28:06.563 に答える
50

使用できます

set define off

これを使用すると、入力のプロンプトは表示されません

于 2012-10-18T18:27:18.580 に答える
3
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

または代わりに:

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

最初の例では、バックスラッシュを使用して & をエスケープできます。

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

于 2018-01-15T14:19:53.307 に答える
1

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

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

&is を文字列内の二重引用符で囲むことにより、リテラルとして定義し"&"ます。

于 2017-02-08T12:51:50.627 に答える
0
REPLACE(<your xml column>,'&',chr(38)||'amp;')
于 2016-05-26T09:15:41.163 に答える
0
于 2020-01-14T19:07:18.977 に答える