169

我试图在我的 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);

尽管这对这个问题有类似的解决方案,但问题的提出却截然不同。他们最终可能会得到相同的解决方案,但这并不意味着问题是相同的。

4

11 回答 11

245

代替

node_name = 'Geometric Vectors \& Matrices'

采用

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

38 是 & 符号的 ascii 代码,在这种形式下,它将被解释为字符串,仅此而已。我试过了,它奏效了。

另一种方法可能是使用 LIKE 和下划线而不是 '&' 字符:

node_name LIKE 'Geometric Vectors _ Matrices' 

你也能找到其他记录的机会,仅在这一个角色中有所不同,这是非常低的。

于 2012-10-18T18:42:37.883 回答
131

Escape\默认设置为,无需设置;但如果你这样做,不要用引号括起来。

& 是 SQL*Plus替换变量标记;但是您可以更改它,或者在您的情况下更有用的是完全关闭它,方法是:

set define off

那么你根本不需要费心逃避价值。

于 2012-10-18T18:28:06.563 回答
50

您可以使用

set define off

使用它不会提示输入

于 2012-10-18T18:27:18.580 回答
35

直接来自 oracle sql 基础书籍

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

如果不设置定义,如何逃脱它。

于 2013-12-05T19:32:59.393 回答
12

为了逃脱&,您可以尝试以下方法:-

  1. set scan off
  2. set define off
  3. set escape on 然后替换&\&
  4. 替换&&&

其中一个应该至少可以工作。

另外,如果您使用的是 PL/SQL 开发人员,那么SQL 窗口底部有 &图标,请前往那里并禁用。请注意,在旧版本中,此选项不存在。

还要确保 set define off 写在脚本的开头。

于 2018-10-15T10:55:24.127 回答
3
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

或者:

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

第一个允许您使用反斜杠来转义 &。

第二个关闭并“全局”(无需在任何地方添加反斜杠)。您可以通过和从该行再次打开它,set define on与号将恢复其特殊含义,因此您可以在脚本的某些部分而不是其他部分将其关闭。

于 2018-01-15T14:19:53.307 回答
1

这也有效:

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

&您通过在字符串中包含双引号来定义为文字"&"

于 2017-02-08T12:51:50.627 回答
0
REPLACE(<your xml column>,'&',chr(38)||'amp;')
于 2016-05-26T09:15:41.163 回答
0
于 2020-01-14T19:07:18.977 回答
0
--SUBSTITUTION VARIABLES
-- these variables are used to store values TEMPorarily.
-- The values can be stored temporarily through
-- Single Ampersand (&)
-- Double Ampersand(&&)
-- The single ampersand substitution variable applies for each instance when the
--SQL statement is created or executed.
-- The double ampersand substitution variable is applied for all instances until
--that SQL statement is existing.
INSERT INTO Student (Stud_id, First_Name, Last_Name, Dob, Fees, Gender)
VALUES (&stud_Id, '&First_Name' ,'&Last_Name', '&Dob', &fees, '&Gender');
--Using double ampersand substitution variable
INSERT INTO Student (Stud_id,First_Name, Last_Name,Dob,Fees,Gender)
VALUES (&stud_Id, '&First_Name' ,'&Last_Name', '&Dob', &&fees,'&gender');
于 2020-12-07T06:34:53.437 回答
-1

I know it sucks. None of the above things were really working, but I found a work around. Please be extra careful to use spaces between the apostrophes [ ' ], otherwise it will get escaped.

SELECT 'Hello ' '&' ' World';

Hello & World

You're welcome ;)

于 2020-11-26T22:37:17.687 回答