Экранирование символа амперсанда в строке 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

Ответы:


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'

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


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


0

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.