今天遇到一個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')