SQL dizesinde ve işareti kaçan


143

Benim sql veritabanında ada göre belirli bir satır sorgulamaya çalışıyorum ve bir ve işareti vardır. Bir kaçış karakteri belirlemeye ve sonra ve işareti kaçmaya çalıştım, ama bir nedenden dolayı bu işe yaramıyor ve problemimin tam olarak ne olduğundan emin değilim.

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

Bunun bu soruya benzer bir çözümü olmasına rağmen , problemler çok farklı ortaya konmaktadır. Sonunda aynı çözüme sahip olabilirler, ancak bu soruların aynı olduğu anlamına gelmez.


Ben kaçış ('\') karakteri etrafında alıntı gerektiğini sanmıyorum
mcalex

29
set define offbunu yapmanın en basit yoludur.
AnBisw

Yanıtlar:


206

Onun yerine

node_name = 'Geometric Vectors \& Matrices'

kullanım

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

38, ve işareti için ascii kodudur ve bu formda bir dize olarak yorumlanacaktır, başka bir şey değildir. Ben denedim ve işe yaradı.

Başka bir yol da 'LIKE' karakteri ve '&' karakteri yerine bir alt çizgi kullanmak olabilir:

node_name LIKE 'Geometric Vectors _ Matrices' 

Sadece bu karakterde farklı olan başka bir kayıt bulma şansı oldukça düşüktür.


45
Sezgisel değil chr(38), şunları yapabilirsiniznode_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan

1
Diğer zayıf karıştı hem kendime ruhlar, not için o olduğunu chr(38), değil char(38) .
xdhmoore

Bunun &MySQL'de kaçması gerekmediğini unutmayın . Ayrıca MySQL'in işlevi yoktur CHR().
asmaier

113

Escape \varsayılan olarak ayarlıdır , bu yüzden ayarlamanız gerekmez; ama eğer yaparsanız, tırnak içine almayın.

Ve işareti SQL * Plus ikame değişkeni işaretleyicisidir; ancak bunu değiştirebilir veya durumunuzda daha faydalı bir şekilde tamamen kapatabilirsiniz:

set define off

O zaman hiç değer kaçmak için zahmet gerekmez.


2
Çıkış karakteri\ varsayılan olarak ayarlanmıştır , ancak boole parametresi escapevarsayılan olarak KAPALI olarak ayarlanmıştır. Bu nedenle OP'nin kaçış karakterini ayarlaması gerekmeyebilir, ancak en azından SET ESCAPE ONbunun çalışması için yapması gerekir . Veya, elbette, diğer daha iyi çözümlerden herhangi birini kullanın.
mathguy

46

Kullanabilirsiniz

set define off

Bunu kullandığınızda giriş istenmez


32

doğrudan oracle sql temel bilgiler kitabından

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

nasıl tanımlamak olmadan ondan kaçmak istiyorsunuz.


2
SET DEFINE ON'un eklenmesi faydalıdır.
KSev

@Roman Tanımlamadan da kullanabilirsiniz: Dual'den 'Coda' '&' 'Sid' seçin; (çift tek tırnak)
antcalvente

8

Kaçmak için &aşağıdaki yolları deneyebilirsiniz: -

  1. set scan off
  2. set define off
  3. set escape on Sonra yerine &göre/&
  4. yerine &göre&&

Bunlardan biri en az çalışmalıdır.

Bir ek olarak PL / SQL geliştiricisi kullanıyorsanız , sql penceresinin altında & simgesi var, lütfen oraya gidin ve devre dışı bırakın . Eski sürümde bu seçeneğin mevcut olmadığını unutmayın.

Ayrıca set define off komut dosyasının en başında yazıldığından emin olun.


2

Bu da işe yarar:

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

dize içinde &çift ​​qoutes ile çevreleyerek değişmez olarak tanımlayabilirsiniz "&".


1
Bunu yaparsanız, çift tırnak işaretleri dizenin bir parçası olacak, şöyle:A3D"&"R01
David Balažic

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

Veya alternatif olarak:

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

İlk & & kaçmak için ters eğik çizgi kullanmanızı sağlar.

İkincisi kapanır ve "global olarak" (herhangi bir yere ters eğik çizgi eklemenize gerek yoktur). set define onVe işareti üzerindeki bu satırdan tekrar açabilirsiniz özel anlamlarını geri alacak, böylece komut dosyasının bazı bölümleri için değil, diğerleri için de kapatabilirsiniz.



0

Ben bir INSERT içinde "&" bulmak ve değiştirmek için bir regex yazdım, umarım bu birine yardımcı olur.

İşin püf noktası, "&" ifadesinin diğer metinlerle olduğundan emin olmaktı.

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

değiştirmek “$1' || chr(38) || '$3”

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.