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.


saya tidak berpikir Anda memerlukan kutipan di sekitar karakter escape ('\')
mcalex

29
set define offadalah cara paling sederhana untuk melakukannya.
AnBisw

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.


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.


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


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.


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.


2

Ini juga berfungsi:

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

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


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.



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”

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.