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.
set define off
adalah cara paling sederhana untuk melakukannya.Jawaban:
Dari pada
menggunakan
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 '&':
Kemungkinan Anda akan menemukan beberapa rekaman lain juga, yang berbeda hanya dalam satu karakter ini, cukup rendah.
sumber
chr(38)
, Anda bisa melakukannyanode_name = 'Geometric Vectors &' || ' Matrices'
chr(38)
, bukanchar(38)
.&
tidak perlu dilepaskan di MySQL. Juga MySQL tidak memiliki fungsiCHR()
.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:
Maka Anda tidak perlu repot melepaskan nilai sama sekali.
sumber
\
default, tetapi parameter booleanescape
diatur ke OFF secara default. Jadi OP mungkin tidak perlu mengatur karakter pelarian, tetapi dia setidaknya perluSET ESCAPE ON
untuk itu berfungsi. Atau, tentu saja, gunakan solusi lain yang lebih baik.Kamu bisa memakai
Menggunakan ini tidak akan meminta input
sumber
langsung dari buku dasar oracle sql
bagaimana orang bisa menghindarinya tanpa menetapkan setting.
sumber
Untuk melarikan diri
&
Anda dapat mencoba cara berikut: -set scan off
set define off
set escape on
lalu ganti&
dengan/&
&
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.
sumber
Ini juga berfungsi:
select * from mde_product where cfn = 'A3D"&"R01'
Anda mendefinisikan
&
sebagai literal dengan melampirkan adalah dengan qoutes ganda"&"
dalam string.sumber
A3D"&"R01
atau sebagai alternatif:
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 on
dan dari baris itu pada ampersand akan mendapatkan makna khusus mereka kembali, sehingga Anda dapat mematikannya untuk beberapa bagian skrip dan bukan untuk yang lain.sumber
sumber
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”
sumber