我需要提取包含特殊符号('.'
)的列值。
我写了如下代码
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.
答案 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 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
和is obsolete,所以不要在新代码中使用它。