Уникнути символу амперсанд у рядку SQL


143

Я намагаюся запитати певний рядок по імені в моїй базі даних sql, і він має "ampersand". Я спробував встановити символ втечі, а потім втекти з амперсанда, але чомусь це не працює, і я не впевнений, у чому саме моя проблема.

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

Хоча це має подібне вирішення цього питання , проблеми поставлені дуже по-різному. Вони можуть мати те саме рішення, але це не означає, що питання однакові.


я не думаю, що тобі потрібна цитата навколо символу втечі ('\')
mcalex

29
set define offце найпростіший спосіб зробити це.
AnBisw

Відповіді:


205

Замість

node_name = 'Geometric Vectors \& Matrices'

використання

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

38 - код ascii для ampersand, і в такому вигляді він буде інтерпретуватися як рядок, нічого іншого. Я спробував це, і це спрацювало.

Іншим способом може бути використання LIKE та підкреслення замість символу "&":

node_name LIKE 'Geometric Vectors _ Matrices' 

Шанс, що ви теж знайдете якийсь інший запис, який відрізняється лише цим символом, досить низький.


45
Замість неінтуїтивного chr(38)можна зробитиnode_name = 'Geometric Vectors &' || ' Matrices'
Джей Салліван

1
Для інших бідних розгублених душ, схожих на мене, зауважте, що це так chr(38), ні char(38) .
xdhmoore

Зверніть увагу, що &не потрібно уникати в MySQL. Також MySQL не має функції CHR().
asmaier

113

Escape встановлений \за замовчуванням , тому не потрібно його встановлювати; але якщо ви це зробите, не загортайте це в лапки.

Ampersand - маркер змінної заміни SQL * Plus ; але ви можете змінити його або, більш корисно, у вашому випадку повністю вимкнути його за допомогою:

set define off

Тоді вам взагалі не потрібно займатись уникненням значення.


2
Втеча символ встановлений в \ за замовчуванням, але логічний параметр escapeвстановлений в положення OFF за замовчуванням. Тож ОП може не потребувати встановлення символу втечі, але йому / їй потрібно хоча б SET ESCAPE ONдля цього працювати. Або, звичайно, використовувати будь-які інші, кращі рішення.
mathguy

46

Можна використовувати

set define off

Використовуючи це, він не запросить введення


32

прямо з книги фундаментальних даних oracle sql

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

як би уникнути цього, не встановивши налаштування.


2
Допомога SET DEFINE ON є корисною.
KSev

@Roman Без визначення ви також можете використовувати: виберіть "Coda" "та" Sid "з подвійного; (подвійні одиночні цитати)
antcalvente

8

Для втечі &можна спробувати наступними способами:

  1. set scan off
  2. set define off
  3. set escape on потім замінити &на/&
  4. замінити &на&&

Один з них повинен працювати принаймні.

Dditionally , якщо ви використовуєте PL / SQL розробник тобто і значок в нижній частині вікна SQL , будь ласка , туди і відключити його . Зауважте, що у старшій версії ця опція відсутня.

Також переконайтеся, що встановлений параметр off off написаний на самому початку сценарію.


2

Це також працює:

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

Ви визначаєте &як буквальний, додаючи до нього подвійні двозначні "&"рядки.


1
Якщо ви це зробите, подвійні лапки стануть частиною рядка, як це:A3D"&"R01
Давид Балажич

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

або альтернативно:

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

Перший дозволяє використовувати зворотний нахил для виходу з &.

Другий вимикається та "глобально" (не потрібно нікуди додавати зворотній косу рису). Ви можете ввімкнути його знову set define onі з цього рядка на амперсандах поверне своє особливе значення, тому ви можете вимкнути його для деяких частин сценарію, а не для інших.



0

Я написав регулярний вираз, щоб допомогти знайти та замінити "&" в INSERT, сподіваюся, що це комусь допоможе.

Хитрість полягала в тому, щоб переконатися, що "&" - це інший текст.

Знайдіть “(\'[^\']*(?=\&))(\&)([^\']*\')”

Замініть “$1' || chr(38) || '$3”

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.