it-roy-ru.com

Экранирующий символ амперсанда в строке SQL

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

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);

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

106
Slater Victoroff

Вместо 

node_name = 'Geometric Vectors \& Matrices'

использование 

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

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

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

node_name LIKE 'Geometric Vectors _ Matrices' 

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

165
Imre Greilich

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

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

set define off

Тогда вам не нужно вообще избегать значения.

92
Alex Poole

Ты можешь использовать

set define off

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

36
Ankur

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

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

как можно избежать этого без установки определения.

25
Roman

Чтобы избежать &, вы можете попробовать следующие способы: -

  1. set scan off
  2. set define off
  3. set escape on затем замените & на/&
  4. заменить & на &&

Один из них должен работать по крайней мере.

A если вы используете PL/SQL-разработчик, то в нижней части окна SQL есть значок & icon , перейдите туда и отключить it. Обратите внимание, в более старой версии этой опции нет.

Также убедитесь, что set define off записана в самом начале скрипта. 

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

или альтернативно:

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

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

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

1
David Balažic

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

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

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

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