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

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

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 "&" в строке.