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