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