zoukankan      html  css  js  c++  java
  • SQL语句中&、单引号等特殊符号的处理

    今天遇到一个insert语句,在SQL Tools(链接Oracle数据库)插入的某列值为“Computer Hardware & Software>>CPU",这样执行会有问题,因为"&"是一个特殊符号。 符号(&) 在Oracle里有特殊含义,是一个宏变量标识符;在Oracle中,& 是从需要外部输入输入的变量。PS:MySqL中可以直接用"P&G"这样的字符串,故不存在本文所说的问题。要想插入带有&符号的列, 需要用如下的方法(当然,用PL/SQL Developer的for update语句也是可的,但我一般不用此工具)。

    如下SQL语句就不能正确运行:
    select 'Alibaba&Taobao' from dual;
    处理方法:
    用Oracle的字符串处理函数chr处理。chr(38)表示 &符号
    如:select chr(38) from dual;
    结果:&
    select 'Alibaba'||chr(38)||'Taobao' from dual;
    结果:Alibaba&Taobao
    其他不能处理的特殊符合,也用类似的方式处理。如果不知道该特殊符号的ascii值,可以调用ascii函数处理,
    如:select ascii('&') from dual;
    结果:38

    再附一个单引号(')的例子(I'm OK):
    1.     SELECT 'I' || '''m OK' from dual;
    2.     SELECT 'I''m OK' from dual;
    3.     SELECT 'I'||Chr(39)||'m OK' FROM dual;
    1、2两个都是转义字符(只是用不用连接符||的区别),第3中是一个字符替换。
    PS:我用字符替换来弄and符号(&)就没有成功了。

    当然,也看到网上有人提出了“Set define OFF;”和“Select 'Tom' || '&' || 'Jerry' from dual;”的方法来解决,不过我试了一下,并没有成功。

    案例:

    create view bnm as
    select ROW_NUMBER() OVER (ORDER BY tf_CategoryName desc) XuHao,tf_CategoryName tf_Name,sum(Tr_Count) Tr_Count from tb_FaultCategory a 
    left join 
    (select TR_ELECTRICALCATEGORYID ,COUNT(*) Tr_Count from TB_REPAIRSBASEINFO a1
    where tr_RepareResult!='6' group by TR_ELECTRICALCATEGORYID) b on a.fid=b.TR_ELECTRICALCATEGORYID group by tf_CategoryName
    
    go
    declare @s varchar(8000)
    select @s=ISNULL(@s+',','')+''''+tf_Name+'''=sum(case when tf_Name='''+tf_Name+''' then Tr_Count else 0 end)'
    + ',cast(sum( case when tf_Name='''+tf_Name+''' then Tr_Count else 0 end)*100/sum(Tr_Count) as varchar(20))+''%'' as ''' +'报修率'''
    from bnm group by tf_Name
    print @s
    exec('select '+@s +' from bnm')
  • 相关阅读:
    linux下利用elk+redis 搭建日志分析平台教程
    C# 短信发送 邮件发送
    面向对象编程思想-装饰模式
    面向对象编程思想-桥接模式
    面向对象编程思想-适配器模式
    面向对象编程思想-原型模式
    面向对象编程思想-建造者模式
    面向对象编程思想-抽象工厂模式
    面向对象编程思想-工厂方法模式
    面向对象编程思想-简单工厂模式
  • 原文地址:https://www.cnblogs.com/zmztya/p/5680686.html
Copyright © 2011-2022 走看看