Я пытаюсь запросить определенную строку по имени в моей базе данных 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);
Хотя у этого есть аналогичное решение этого вопроса , проблемы ставятся совсем по-другому. У них может быть одно и то же решение, но это не значит, что вопросы одинаковы.
set define off
это самый простой способ сделать это.Ответы:
Вместо того
использовать
38 - это код ascii для амперсанда, и в этой форме он будет интерпретироваться как строка, и ничего больше. Я попробовал, и это сработало.
Другой способ - использовать LIKE и подчеркивание вместо символа '&':
Вероятность того, что вы найдете и другую запись, которая отличается только этим одним персонажем, довольно мала.
источник
chr(38)
, вы можете сделатьnode_name = 'Geometric Vectors &' || ' Matrices'
chr(38)
, неchar(38)
.&
в MySQL нет необходимости экранировать. Также MySQL не имеет этой функцииCHR()
.\
По умолчанию для Escape установлено значение , поэтому устанавливать его не нужно; но если вы это сделаете, не заключайте его в кавычки.Амперсанд - маркер подстановочной переменной SQL * Plus ; но вы можете изменить его или, что более полезно, в вашем случае полностью отключить, с помощью:
set define off
Тогда вам вообще не нужно беспокоиться об экранировании значения.
источник
\
значение, но для логического параметраescape
по умолчанию установлено значение OFF. Таким образом, OP может не нуждаться в установке escape-символа, но ему / ей нужно, по крайней мере,SET ESCAPE ON
для того, чтобы это работало. Или, конечно, используйте любое другое, лучшее решение.Ты можешь использовать
set define off
Используя это, он не будет запрашивать ввод
источник
прямо из книги основ oracle sql
SET DEFINE OFF select 'Coda & Sid' from dual; SET DEFINE ON
как бы избежать этого, не задав определения.
источник
Чтобы сбежать,
&
вы можете попробовать следующие способы: -set scan off
set define off
set escape on
затем замените&
на/&
&
на&&
По крайней мере, один из них должен работать.
Кроме того, если вы используете PL / SQL-разработчик, в нижней части окна sql есть значок &, перейдите туда и отключите его . Обратите внимание, что в более старой версии этой опции нет.
Также убедитесь, что set define off написан в самом начале скрипта.
источник
\&
?set escape on ... node_name = 'Geometric Vectors \& Matrices' ...
или альтернативно:
set define off ... node_name = 'Geometric Vectors & Matrices' ...
Первый позволяет использовать обратную косую черту для выхода из &.
Второй отключает & "глобально" (нигде не нужно добавлять обратную косую черту). Вы можете включить его снова,
set define on
и с этой строки амперсанды вернут свое особое значение, поэтому вы можете выключить его для некоторых частей скрипта, а не для других.источник
Это тоже работает:
select * from mde_product where cfn = 'A3D"&"R01'
вы определяете
&
как литерал, заключая"&"
в строку двойные кавычки .источник
A3D"&"R01
REPLACE(<your xml column>,'&',chr(38)||'amp;')
источник
Я написал регулярное выражение, чтобы помочь найти и заменить "&" в INSERT, я надеюсь, что это кому-то поможет.
Хитрость заключалась в том, чтобы убедиться, что «&» стоит рядом с другим текстом.
найти
“(\'[^\']*(?=\&))(\&)([^\']*\')”
Заменить
“$1' || chr(38) || '$3”
источник