Экранирование символа амперсанда в строке SQL
Я пытаюсь запросить определенную строку по имени в моей базе данных 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);
Хотя это аналогичное решение для этого вопроса, проблемы возникают по-разному. Они могут оказаться в том же решении, но это не значит, что вопросы одинаковы.
Ответы
Ответ 1
Вместо
node_name = 'Geometric Vectors \& Matrices'
использовать
node_name = 'Geometric Vectors ' || chr(38) || ' Matrices'
38 - это код ascii для амперсанда, и в этой форме он будет интерпретироваться как строка, и ничего больше. Я попробовал, и это сработало.
Другим способом может быть использование LIKE и подчеркивание вместо '&' символ:
node_name LIKE 'Geometric Vectors _ Matrices'
Вероятность того, что вы найдете и другую запись, которая отличается только от одного персонажа, довольно низкая.
Ответ 2
По умолчанию для Escape установлено значение \
, поэтому вам не нужно его устанавливать; но если вы это сделаете, не заверните его в кавычки.
Амперсанд - это SQL * Plus переменная замещения; но вы можете изменить его, или более полезно в вашем случае полностью отключить его, используя:
set define off
Тогда вам не нужно беспокоиться о том, чтобы избежать значения вообще.
Ответ 3
Вы можете использовать
set define off
Используя это, он не будет запрашивать ввод
Ответ 4
прямо из книги основополагающих принципов sql
SET DEFINE OFF
select 'Coda & Sid' from dual;
SET DEFINE ON
как бы избежать этого, не задав define.
Ответ 5
Это также работает:
select * from mde_product where cfn = 'A3D"&"R01'
вы определяете &
как литерал, заключая в него двойные qoutes "&"
.
Ответ 6
REPLACE(<your xml column>,'&',chr(38)||'amp;')