如何在where子句中获取包含特殊符号的值

时间:2013-04-05 06:08:21

标签: oracle

我需要提取包含特殊符号('.')的列值。

我写了如下代码

SELECT   value, name_display_code
              FROM vp40.ATTRIBUTES
             WHERE attribute_type_id IN (
                      SELECT attribute_type_id
                        FROM vp40.attribute_types
                       WHERE name_display_code =
                                   'ATTRIBUTE_TYPE.R'
                                || '&'
                                || 'D GMD NO'||'.')

我需要的价值是ATTRIBUTE_TYPE.R&D GMD NO.

1 个答案:

答案 0 :(得分:3)

TL; DR:set define off在运行查询之前(可能)。


句点(.)不是特殊字符。你分割和连接这个值的方式让我想知道你是否真的在SQL * Plus或SQL Developer(或者其他客户端)中看到substitution variable问题,因为&,反过来可以使.似乎消失 - 虽然不是在你的具体情况下。

句点可以标记替换变量的结尾,如果下一个字符是字符串的一部分,则需要它,所以如果你有:

select 'R&Ddept' from dual;

然后整个'Ddept'将被视为替换变量:

Enter value for ddept: D
old   1: select 'R&Ddept' from dual
new   1: select 'RD' from dual

'R
--
RD

要使D成为替换变量并将'dept'保留为固定字符串,您可以用句点分隔变量:

select 'R&D.dept' from dual;

Enter value for d: D
old   1: select 'R&D.dept' from dual
new   1: select 'RDdept' from dual

'RDDEP
------
RDdept

但是如果你想要实际显示一个句号,你需要添加一个句号,以考虑替换处理吞下的句号:

select 'R&D..dept' from dual;

Enter value for d: D
old   1: select 'R&D..dept' from dual
new   1: select 'RD.dept' from dual

'RD.DEP
-------
RD.dept

显然这只适用于您真正想要替换的情况,当然&在任何情况下都不会出现在最终字符串中。在你的情况下(对我来说)更容易混淆,在&.之间有一个空格意味着它不会被视为分隔符;对于'ATTRIBUTE_TYPE.R&D GMD NO.',只有&D被视为替换,.保持不变。我是猜测你得到了更短的价值。

你可能想要达到的目的是完全避免替换。你正在这样做的方式,拆分字符串以便&单独出现并且看不到替换,这当然是一种方式但很痛苦,特别是如果你不一定控制正在使用的字符串或有多个价值观。

至少有两种方式;使用set escapeset define

set escape '\'
select 'ATTRIBUTE_TYPE.R\&D GMD NO.' from dual;

这定义了SQL * Plus会话的转义字符,然后您可以将该字符放在&符号之前 - \& - 因此不会将其视为替换变量。但是你仍然需要修改原始字符串,这是不理想的。

set define off
select 'ATTRIBUTE_TYPE.R&D GMD NO.' from dual;

这会完全禁用替换,因此原始字符串保持不变。这通常是最简单的方法。您可以根据需要在脚本中打开和关闭它;如果你有一个单一的语句需要在某些地方替换,但也有你想要保留的&符号你可以恢复到转义机制,或者定义一个不同的替换字符,只要你能找到其他你永远不需要的东西逃避。

(您可能还会看到对set scan off的引用;这种情况早于set defineis obsolete,所以不要在新代码中使用它。