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