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


хотя это имеет аналогичное решение этот вопрос, проблемы возникают совсем по-другому. Они могут в конечном итоге иметь одно и то же решение, но это не означает, что вопросы являются тот же.

928   7  

7 ответов:

вместо

node_name = 'Geometric Vectors \& Matrices'

использовать

node_name = 'Geometric Vectors ' || chr(38) || ' Matrices' 

38-это код ascii для амперсанда, и в этом виде он будет интерпретироваться как строка, ничего больше. Я попробовал, и это сработало.

другой способ может использовать как и подчеркивание вместо символа'&':

node_name LIKE 'Geometric Vectors _ Matrices' 

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

Escape имеет значение \ по умолчанию, поэтому вам не нужно устанавливать его; но если вы это сделаете, не заключайте его в кавычки.

амперсанд-это SQL * Plus замена переменной маркер, но вы можете изменить, или более полезно в вашем случае отключить его полностью, с:

set define off

тогда вам не нужно беспокоиться о том, чтобы избежать значения вообще.

можно использовать

set define off

используя это, он не будет запрашивать ввод

прямо из книги основ oracle sql

SET DEFINE OFF
select 'Coda & Sid' from dual;
SET DEFINE ON

как бы избежать его без установки define.

set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

или же:

set define off
... node_name = 'Geometric Vectors & Matrices' ...

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

второй отключается & "глобально" (нет необходимости добавлять обратную косую черту в любом месте). Вы можете включить его снова с помощью set define on и из этой строки на амперсандах будет возвращено их особое значение, поэтому вы можете отключить его для некоторых частей скрипта, а не для других.

REPLACE(<your xml column>,'&',chr(38)||'amp;')

Это тоже работает:

select * from mde_product where cfn = 'A3D"&"R01'

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

Comments

    Ничего не найдено.