Экранирование символа амперсанда в строке SQL

149

Я пытаюсь запросить определенную строку по имени в моей базе данных sql, и у нее есть амперсанд. Я попытался установить escape-символ, а затем избежать амперсанда, но по какой-то причине это не работает, и я не уверен, в чем именно заключается моя проблема.

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

Хотя у этого есть аналогичное решение этого вопроса , проблемы ставятся совсем по-другому. У них может быть одно и то же решение, но это не значит, что вопросы одинаковы.

Слейтер Виктофф
источник
я не думаю, что вам нужна цитата вокруг символа escape ('\')
mcalex
31
set define offэто самый простой способ сделать это.
AnBisw
1
Дубликат stackoverflow.com/questions/118190/…
oliver-clare

Ответы:

215

Вместо того

node_name = 'Geometric Vectors \& Matrices'

использовать

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

38 - это код ascii для амперсанда, и в этой форме он будет интерпретироваться как строка, и ничего больше. Я попробовал, и это сработало.

Другой способ - использовать LIKE и подчеркивание вместо символа '&':

node_name LIKE 'Geometric Vectors _ Matrices' 

Вероятность того, что вы найдете и другую запись, которая отличается только этим одним персонажем, довольно мала.

Имре Грейлих
источник
46
Вместо неинтуитивного chr(38), вы можете сделатьnode_name = 'Geometric Vectors &' || ' Matrices'
Джей Салливан
1
Для других бедных растерянных душ , так к себе, отметить , что это chr(38), не char(38) .
xdhmoore
Обратите внимание, что &в MySQL нет необходимости экранировать. Также MySQL не имеет этой функции CHR().
asmaier
119

\По умолчанию для Escape установлено значение , поэтому устанавливать его не нужно; но если вы это сделаете, не заключайте его в кавычки.

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

set define off

Тогда вам вообще не нужно беспокоиться об экранировании значения.

Алекс Пул
источник
2
По умолчанию для escape- символа установлено \ значение, но для логического параметра escapeпо умолчанию установлено значение OFF. Таким образом, OP может не нуждаться в установке escape-символа, но ему / ей нужно, по крайней мере, SET ESCAPE ONдля того, чтобы это работало. Или, конечно, используйте любое другое, лучшее решение.
mathguy
49

Ты можешь использовать

set define off

Используя это, он не будет запрашивать ввод

Анкур
источник
33

прямо из книги основ oracle sql

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

как бы избежать этого, не задав определения.

Римский
источник
2
Полезно добавление SET DEFINE ON.
KSev
@Roman Без определения вы также можете использовать: выберите «Coda» и «Sid» из двойного; (двойные одинарные кавычки)
antcalvente 04
10

Чтобы сбежать, &вы можете попробовать следующие способы: -

  1. set scan off
  2. set define off
  3. set escape on затем замените &на/&
  4. заменить &на&&

По крайней мере, один из них должен работать.

Кроме того, если вы используете PL / SQL-разработчик, в нижней части окна sql есть значок &, перейдите туда и отключите его . Обратите внимание, что в более старой версии этой опции нет.

Также убедитесь, что set define off написан в самом начале скрипта.

А Потребитель
источник
На шаге 3 этого не должно быть \&?
Manngo
3
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

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

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

Первый позволяет использовать обратную косую черту для выхода из &.

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

Давид Балажич
источник
2

Это тоже работает:

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

вы определяете &как литерал, заключая "&"в строку двойные кавычки .

Copmac
источник
1
Если вы это сделаете, двойные кавычки станут частью строки, например:A3D"&"R01
Давид Балажич
0

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

Хитрость заключалась в том, чтобы убедиться, что «&» стоит рядом с другим текстом.

найти “(\'[^\']*(?=\&))(\&)([^\']*\')”

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

that_roy
источник