access中case替代方法
2009-12-26 14:01
select
userpassportid as passportid,
userid,
grantorid,
case objecttypeid
when 1 then objectid
end
as terminalid,
type, flag, grantdate, validate, invalidate
from userpassport
在sql裡能執行,但在access裡總提示語法錯誤(操作符丟失).在查詢表示式'case objecttypeid
when 1 then objectid
end'中?
sql:
select bb,cc,case aa when '一星級' then '*'
when '二星級' then '** '
when '三星級' then '*** '
when '四星級' then '**** '
when '五星級' then '***** '
endfrom aaa
access:
select bb,cc,iif(aa='一星級','*',iif(aa='二星級','**',iif(aa='三星級','***',iif(aa='四星級','****',iif(aa='五星級','*****')))))
from aaa;
access中switch和choose關鍵字的用法access中程式流程函式有三個,iif ,switch
switch關鍵字
access中沒有case when的用法,所以對於某些篩選比較就顯得很吃力。不過還好,access中有乙個switch可以解決這個問題。switch 的語法是:switch( case_1, result_1[, case_2, result_2...])。switch的計算順序為從左到右,將返回第乙個為true的case對應的result。access對switch有預編譯(基本能夠寫進access的sql都有預編譯,access不支援execute(sqlstring)的用法),所以switch中的條件和結果不能有邏輯錯誤和語法錯誤,否則不能執行。
例項:表tuser中有字段*** text(1),用於儲存使用者性別,其中,如***='m',使用者為男性;***='f',使用者為女性;其他情況為保密。為了便於sql語句的說明,我們假設還有其他兩個字段,userid和username。
在sqlserver中,如果要在搜尋結果中直接顯示性別的名稱***name(不是m/f之類的**),使用case when很方便。
select userid,
username,
***name = when lcase(***)
case 'm' then n'男'
case 'f' then n'女'
else n'保密' end
from tuser
access不支援when case的用法。雖然不那麼靈巧,但是用switch可以解決這個問題。
select userid,
username,
switch(
*** = 'f', '男',
*** = 'm', '女',
true, '保密'
) as ***name
from tuser
上述中最後乙個case為true,該用法類似於when case語法中的else。
choose關鍵字
對於choose關鍵字的用法,暫時沒有想到在它與sqlserver中的那個用法對應。
choose函式的語法如下:choose(index,choice_1[,choice_2...])。其中,index為從1開始的整數,choice對應的是與index相對應的選擇項的值。
一時沒有想到太好的例子,就用上面的那個關於使用者性別的例子吧。假如上面的***使用1替代m,代表男性,2替代f,代表女性。
select userid,
username,
iif(choose(cint(***),'男性','女性') is null,
'保密',
choose(cint(***),'男性','女性')
) as ***name
from tuser
access中程式流程函式有三個,iif ,switch 和 choose。iif的用法已經很常見了,網上搜一下大把打把的。這兒主要講後面的兩個:switch和choose。
switch關鍵字
access中沒有case when的用法,所以對於某些篩選比較就顯得很吃力。不過還好,access中有乙個switch可以解決這個問題。switch 的語法是:switch( case_1, result_1[, case_2, result_2...])。switch的計算順序為從左到右,將返回第乙個為true的case對應的result。access對switch有預編譯(基本能夠寫進access的sql都有預編譯,access不支援execute(sqlstring)的用法),所以switch中的條件和結果不能有邏輯錯誤和語法錯誤,否則不能執行。
例項:表tuser中有字段*** text(1),用於儲存使用者性別,其中,如***='m',使用者為男性;***='f',使用者為女性;其他情況為保密。為了便於sql語句的說明,我們假設還有其他兩個字段,userid和username。
在sqlserver中,如果要在搜尋結果中直接顯示性別的名稱***name(不是m/f之類的**),使用case when很方便。
select userid,
username,
***name = when lcase(***)
case 'm' then n'男'
case 'f' then n'女'
else n'保密' end
from tuser
access不支援when case的用法。雖然不那麼靈巧,但是用switch可以解決這個問題。
select userid,
username,
switch(
*** = 'f', '男',
*** = 'm', '女',
true, '保密'
) as ***name
from tuser
上述中最後乙個case為true,該用法類似於when case語法中的else。
choose關鍵字
對於choose關鍵字的用法,暫時沒有想到在它與sqlserver中的那個用法對應。
choose函式的語法如下:choose(index,choice_1[,choice_2...])。其中,index為從1開始的整數,choice對應的是與index相對應的選擇項的值。
一時沒有想到太好的例子,就用上面的那個關於使用者性別的例子吧。假如上面的***使用1替代m,代表男性,2替代f,代表女性。
select userid,
username,
iif(choose(cint(***),'男性','女性') is null,
'保密',
choose(cint(***),'男性','女性')
) as ***name
from tuser
如果你說***還是使用的m/f,那麼怎麼用?,可以畫蛇添足,使用choose + switch的巢狀啊。具體的巢狀**我就不寫了,沒有什麼價值,主要是在cint(***)那兒巢狀,通過switch對不同的***取不同的index值。
實話實說,我還沒有發現choose有什麼更好的意義。因為index對應的choice都是索引好的,就是說需要事先定義的。相對來說,這樣就很不靈活了。索引項都是乙個乙個寫的(本文不討論在資料庫外生成sql的情況),這很麻煩。功能上switch可以滿足它的所有功能,而且更靈活,邏輯更清晰。
通過看這個得到了我要的結果:
update tb_valuation as a,(select iif(state='審核','阻止',iif(state='阻止','審核',iif(state='新點評','審核'))) as b from tb_valuation where vid=@vid) as c set state=c.b where vid=@vid;
與sql2005相比的查詢
select fatherid =case fatherid
when 1 then 'aaa'
when 2 then 'bbb'
else 'ccc '
end
from [111]
替代CASE的方法
case是乙個標量表示式,根據條件邏輯返回乙個值,既然是表示式,就不能當是一條語句來控制邏輯的流程。今天在網上看到一帖 根據上帖,建立乙個表,並填充資料 create tablet a nvarchar 10 b nvarchar 10 insert into t values 001 y inse...
替代CASE的方法
case是乙個標量表示式,根據條件邏輯返回乙個值,既然是表示式,就不能當是一條語句來控制邏輯的流程。今天在網上看到一帖 根據上帖,建立乙個表,並填充資料 create tablet a nvarchar 10 b nvarchar 10 insert into t values 001 y inse...
替代方法 聲母替代 遺漏的矯治方法
本節課程 言語訓練的知識與技巧 之 聲母替代 遺漏的矯治方法 本期,馬老師講解了聲母替代 遺漏有哪些常見的出錯現象及具體矯治辦法,並進行詳細分析。聲母替代 遺漏的矯治方法 言語訓練的知識與技巧 主要講述了聽障兒童不同的 階段,言語訓練的內容 技巧與側重點。從 初期家長關心的聽能問題入手,講解聽能反應...