逃脱&在SQL中的空间符号

时间:2015-05-22 10:35:00

标签: sql oracle oracle-sqldeveloper

我对以下查询感到震惊。请帮帮我。

select 
      case when column in ('1 Chelsea'|| chr(38) ||
      'Friend (2)','5 Manchester''s Song'||chr(38)||
      'Hamilton') then 'Others' else N/A
from FA

以上查询的输出

1 Chelsea & Friend (2)          N/A
5 Manchester's Song&Hamilton   Others

从上面的查询中,输出应该类似于以下输出

1 Chelsea & Friend (2)          Others
5 Manchester's Song&Hamilton   Others

请有人帮我解决这个问题。另请注意,我无法使用SET DEFINE OFF

2 个答案:

答案 0 :(得分:1)

SQL字符串中的''必须与另一个'进行转义'。因此,'my ''house'''实际上意味着my 'house'

因此'5 Manchester''s Song'5 Manchester''s Song不匹配,但5 Manchester's Song。您必须改为查询'5 Manchester''''s Song'

顺便说一句:没有必要使用chr(38),你可以使用&直接:

select 
  case when column in (
    '1 Chelsea & Friend (2)',
    '5 Manchester''''s Song&Hamilton'
  ) then 'Others' else 'N/A' end
from FA;

答案 1 :(得分:0)

我建议两件事:

  • 设置DEFINE OFF CHR(38)摆脱替换运算符 &

大多数基于GUI的客户端工具能够执行 SQL * Plus命令。在会话 SQL工作表 SQL Developer 中执行一次,它不会再次提示您输入替代值

SET DEFINE OFF
  

' 5曼彻斯特'''''

使用引用字符串文字技术,它可以写成:

q'[Manchester's Song&Hamilton]'

例如,

SQL> SET DEFINE OFF
SQL> WITH DATA(a, b) AS(
  2  SELECT 1,  'Chelsea & Friend (2)' FROM dual UNION ALL
  3  SELECT 5, q'[Manchester's Song&Hamilton]' FROM DUAL UNION ALL
  4  SELECT 6, 'abcd' FROM DUAL
  5  )
  6  SELECT a,
  7    CASE
  8      WHEN b IN ('Chelsea & Friend (2)',q'[Manchester's Song&Hamilton]')
  9      THEN 'Others'
 10      ELSE 'N/A'
 11    END status
 12  FROM DATA
 13  /

         A STATUS
---------- ------
         1 Others
         5 Others
         6 N/A

SQL>

关于引用字符串文字技术的更详细示例,请参阅此答案How to anticipate and escape single quote ' in oracle