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

78

Я пытаюсь запросить определенную строку по имени в моей базе данных 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);

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

  • 0
    я не думаю, что вам нужна цитата вокруг символа escape ('\')
  • 23
    set define off - это самый простой способ сделать это.
Показать ещё 1 комментарий
Теги:
sqlplus
escaping

6 ответов

119
Лучший ответ

Вместо

node_name = 'Geometric Vectors \& Matrices'

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

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

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

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

node_name LIKE 'Geometric Vectors _ Matrices' 

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

  • 35
    Вместо неинтуитивного chr(38) вы можете сделать node_name = 'Geometric Vectors &' || ' Matrices'
  • 0
    Комментарий @ JaySullivan: +1 за простоту!
Показать ещё 1 комментарий
80

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

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

set define off

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

  • 0
    Полностью согласен!
  • 1
    Экранирующий символ по умолчанию имеет значение \ , но по умолчанию для логического параметра escape установлено значение OFF. Таким образом, OP может не потребоваться установить символ выхода, но ему / ей нужно, по крайней мере, установить SET ESCAPE ON , чтобы это работало. Или, конечно, используйте любое другое, лучшее решение.
27

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

set define off

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

19

прямо из книги основополагающих принципов sql

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

как бы избежать этого, не задав define.

  • 2
    Полезно добавить SET DEFINE ON.
1

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

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

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

  • 0
    Если вы сделаете это, двойные кавычки станут частью строки, например: A3D"&"R01
0
REPLACE(<your xml column>,'&',chr(38)||'amp;')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню