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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM