Экранирование символа амперсанда в строке 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
тогда вам не нужно беспокоиться о том, чтобы избежать значения вообще.
прямо из 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
и из этой строки амперсанды вернут свое особое значение, поэтому вы можете отключить его для некоторых частей сценария, а не для других.
Это тоже работает:
select * from mde_product where cfn = 'A3D"&"R01'
определения &
как литерал путем заключать с двойными qoutes "&"
в строке.