Melarikan karakter ampersand dalam string SQL

143

Saya mencoba untuk query baris tertentu dengan nama di database sql saya dan memiliki ampersand. Saya mencoba untuk menetapkan karakter pelarian dan kemudian melarikan diri dari ampersand, tetapi untuk beberapa alasan ini tidak berfungsi dan saya tidak yakin apa sebenarnya masalah saya.

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

Meskipun ini memiliki solusi yang mirip dengan pertanyaan ini , masalah yang diajukan sangat berbeda. Mereka mungkin akhirnya memiliki solusi yang sama, tetapi itu tidak berarti bahwa pertanyaannya sama.

Slater Victoroff
sumber
saya tidak berpikir Anda memerlukan kutipan di sekitar karakter escape ('\')
mcalex
29
set define offadalah cara paling sederhana untuk melakukannya.
AnBisw
1
Gandakan stackoverflow.com/questions/118190/…
oliver-clare

Jawaban:

205

Dari pada

node_name = 'Geometric Vectors \& Matrices'

menggunakan

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

38 adalah kode ascii untuk ampersand, dan dalam bentuk ini akan ditafsirkan sebagai string, bukan yang lain. Saya mencobanya dan berhasil.

Cara lain bisa menggunakan LIKE dan garis bawah sebagai ganti karakter '&':

node_name LIKE 'Geometric Vectors _ Matrices' 

Kemungkinan Anda akan menemukan beberapa rekaman lain juga, yang berbeda hanya dalam satu karakter ini, cukup rendah.

Imre Greilich
sumber
45
Alih-alih tidak intuitif chr(38), Anda bisa melakukannyanode_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan
1
Bagi orang-orang miskin yang bingung sama seperti saya, perhatikan bahwa itu bukanchr(38) , bukan char(38) .
xdhmoore
Catatan yang &tidak perlu dilepaskan di MySQL. Juga MySQL tidak memiliki fungsi CHR().
asmaier
113

Escape diatur \secara default , jadi Anda tidak perlu mengaturnya; tetapi jika Anda melakukannya, jangan membungkusnya dengan tanda kutip.

Ampersand adalah penanda variabel substitusi SQL * Plus ; tetapi Anda dapat mengubahnya , atau lebih bermanfaat dalam kasus Anda, matikan sepenuhnya, dengan:

set define off

Maka Anda tidak perlu repot melepaskan nilai sama sekali.

Alex Poole
sumber
2
Karakter melarikan diri diatur ke \ default, tetapi parameter boolean escapediatur ke OFF secara default. Jadi OP mungkin tidak perlu mengatur karakter pelarian, tetapi dia setidaknya perlu SET ESCAPE ONuntuk itu berfungsi. Atau, tentu saja, gunakan solusi lain yang lebih baik.
mathguy
46

Kamu bisa memakai

set define off

Menggunakan ini tidak akan meminta input

Ankur
sumber
32

langsung dari buku dasar oracle sql

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

bagaimana orang bisa menghindarinya tanpa menetapkan setting.

Roma
sumber
2
Penambahan SET DEFINE ON sangat membantu.
KSev
@Roman Tanpa menentukan Anda juga dapat menggunakan: pilih 'Coda' '&' 'Sid' dari dual; (kutipan tunggal ganda)
antcalvente
8

Untuk melarikan diri &Anda dapat mencoba cara berikut: -

  1. set scan off
  2. set define off
  3. set escape on lalu ganti &dengan/&
  4. ganti &dengan&&

Salah satunya harus bekerja minimal.

Sebuah dditionally jika Anda menggunakan pengembang PL / SQL maka ada & icon di bawah jendela sql silakan pergi ke sana dan menonaktifkan itu . Catatan dalam versi yang lebih lama opsi ini tidak ada.

Pastikan juga set define off ditulis di awal skrip.

Pelanggan
sumber
2

Ini juga berfungsi:

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

Anda mendefinisikan &sebagai literal dengan melampirkan adalah dengan qoutes ganda "&"dalam string.

kopmac
sumber
1
Jika Anda melakukan itu, tanda kutip ganda akan menjadi bagian dari string, seperti ini:A3D"&"R01
David Balažic
2
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

atau sebagai alternatif:

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

Yang pertama memungkinkan Anda menggunakan garis miring terbalik untuk keluar dari &.

Yang kedua mati & "secara global" (tidak perlu menambahkan backslash di mana saja). Anda dapat menyalakannya lagi dengan set define ondan dari baris itu pada ampersand akan mendapatkan makna khusus mereka kembali, sehingga Anda dapat mematikannya untuk beberapa bagian skrip dan bukan untuk yang lain.

David Balažic
sumber
0
REPLACE(<your xml column>,'&',chr(38)||'amp;')
pengguna6385350
sumber
0

Saya menulis sebuah regex untuk membantu menemukan dan mengganti "&" di dalam INSERT, saya harap ini membantu seseorang.

Kuncinya adalah memastikan bahwa "&" dengan teks lain.

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

Menggantikan “$1' || chr(38) || '$3”

that_roy
sumber