0

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

我写了如下代码

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.

4

1 回答 1

3

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


句点 ( .) 不是特殊字符。您拆分和连接值的方式让我想知道您是否真的在 SQL*Plus 或 SQL Developer(或其他客户端)中看到了替换变量问题,因为消失-尽管不是在您的特定情况下。&.

句点可以标记替换变量的结束,如果下一个字符是字符串的一部分,则需要句点,因此如果您有:

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.'只有 the&D被视为替换,而 the.则保持原样。我你以更短的值到达了这一点。

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

至少还有两种其他方式;和:set escape_set 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 define并且已经过时,所以不要在新代码中使用它)。

于 2013-04-05T07:40:53.447 回答