在SQL字符串中转义&字符


143

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

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


我认为您不需要在转义('\')字符周围加引号
mcalex

29
set define off是最简单的方法。
AnBisw 2012年

Answers:


205

代替

node_name = 'Geometric Vectors \& Matrices'

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

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

另一种方法是使用LIKE和下划线代替“&”字符:

node_name LIKE 'Geometric Vectors _ Matrices' 

您还会发现其他记录的机会很低,仅此一个字符有所不同。


45
chr(38)您可以这样做,而不是非直觉的node_name = 'Geometric Vectors &' || ' Matrices'
Jay Sullivan

1
对于其他像我这样困惑的可怜人来说,请注意chr(38)不是 char(38)
xdhmoore

注意,&在MySQL中不需要转义。而且MySQL没有该函数CHR()
asmaier

113

转义\默认设置为,,因此您无需进行设置。但是,如果这样做,请不要将其用引号引起来。

“&”号是SQL * Plus 替代变量标记;但您可以更改它,或更有用的话,可以完全关闭它,方法是:

set define off

然后,您根本不必费心逃避该值。


2
转义字符\ 默认设置为,但布尔参数escape默认设置为OFF。因此,OP可能不需要设置转义字符,但他/她至少需要为此设置SET ESCAPE ON才能正常工作。或者,当然,可以使用其他任何更好的解决方案。
mathguy


32

直接来自Oracle SQL基础知识书

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

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


2
添加SET DEFINE ON很有帮助。
KSev 2014年

@Roman如果没有定义,您也可以使用:从双中选择“ Coda”&“ Sid”;(双引号)
antcalvente

8

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

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

其中之一应至少工作。

另外,如果您使用的是PL / SQL开发人员,则&图标在SQL窗口的底部,请去那里和禁用。请注意,在较早版本中,此选项不存在。

还要确保将set define off写在脚本的最开始。


2

这也可以:

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

您可以&通过"&"在字符串中包含双qoutes 来定义为文字。


1
如果这样做,则双引号将成为字符串的一部分,如下所示:A3D"&"R01
DavidBalažic18年

2
set escape on
... node_name = 'Geometric Vectors \& Matrices' ...

或者:

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

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

第二个关闭并“全局”关闭(无需在任何地方添加反斜杠)。您可以再次打开它,并在set define on与号之间的那一行重新获得其特殊含义,因此您可以在脚本的某些部分而不是其他部分将其关闭。



0

我写了一个正则表达式来帮助在INSERT中查找和替换“&”,希望对您有所帮助。

诀窍是确保“&”与其他文本一起使用。

“(\'[^\']*(?=\&))(\&)([^\']*\')”

更换 “$1' || chr(38) || '$3”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.