0

特別な記号 ( '.') を含む列の値を取得する必要があります。

私は以下のようなコードを書きました

SELECT   value, name_display_code
              FROM vp40.ATTRIBUTES
             WHERE attribute_type_id IN (
                      SELECT attribute_type_id
                        FROM vp40.attribute_types
                       WHERE name_display_code =
                                   'ATTRIBUTE_TYPE.R'
                                || '&'
                                || 'D GMD NO'||'.')

私は値が必要ですATTRIBUTE_TYPE.R&D GMD NO.

4

1 に答える 1

3

TL;DR:set define offクエリを実行する前に (おそらく)。


ピリオド ( .) は特殊文字ではありません。値を分割して連結した方法は、実際に SQL*Plus または SQL Developer (または他の別のクライアント) で置換変数&の問題が発生して.いるのかどうか疑問に思います。あなたの特定のケースではありませんが。

ピリオドは置換変数の終わりを示すことができ、次の文字が文字列の一部である場合に必要です。

select 'R&Ddept' from dual;

次に、「Ddept」全体が置換変数として扱われます。

Enter value for ddept: D
old   1: select 'R&Ddept' from dual
new   1: select 'RD' from dual

'R
--
RD

D置換変数にし、「dept」を固定文字列のままにするには、変数をピリオドで区切ります。

select 'R&D.dept' from dual;

Enter value for d: D
old   1: select 'R&D.dept' from dual
new   1: select 'RDdept' from dual

'RDDEP
------
RDdept

しかし、ピリオドも実際に表示したい場合は、置換処理によって飲み込まれたピリオドを考慮して、ピリオドを追加する必要があります。

select 'R&D..dept' from dual;

Enter value for d: D
old   1: select 'R&D..dept' from dual
new   1: select 'RD.dept' from dual

'RD.DEP
-------
RD.dept

明らかに、これは実際に置換が必要な場合にのみ適用され、もちろん、&これらの場合の最終文字列には表示されません。もっと紛らわしいことに(私にとって)あなたの場合、との間にスペースがある&.、区切り文字として扱われないことを意味します。'ATTRIBUTE_TYPE.R&D GMD NO.'のみが置換として&D扱われ、.そのまま残されます。より短い値でこの時点に到達したと思います。

ここでおそらく達成したいことは、置換を完全に回避することです。文字列を分割して&が単独で表示され、置換が表示されないようにする方法は、確かに 1 つの方法ですが、使用されている文字列を必ずしも制御していない場合や複数の値がある場合は特に苦痛です。

他に少なくとも 2 つの方法があります。と: set escape_set define

set escape '\'
select 'ATTRIBUTE_TYPE.R\&D GMD NO.' from dual;

これにより、SQL*Plus セッションのエスケープ文字が定義され、その文字をアンパサンドの前に置くことができる\&ため、置換変数として扱われません。ただし、元の文字列を変更する必要がありますが、これは理想的ではありません。

set define off
select 'ATTRIBUTE_TYPE.R&D GMD NO.' from dual;

これにより置換が完全に無効になるため、元の文字列はそのまま残ります。これは、一般的に最も単純なアプローチです。スクリプトで必要に応じてオンとオフを切り替えることができます。いくつかの場所で置換が必要であり、保持したいアンパサンドもある単一のステートメントがある場合は、エスケープメカニズムに戻るか、別の置換文字を定義することができます。脱出する。

( ; への参照も表示される場合がありますset scan off。これは より前のものset defineであり、廃止されているため、新しいコードでは使用しないでください)。

于 2013-04-05T07:40:53.447 に答える