access中case替代方法

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 '***** '
end
from 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中有字段sex Text(1),用於存儲用戶性別,其中,如sex='m',用戶爲男性;sex='f',用戶爲女性;其他情況爲保密。爲了便於sql語句的說明,我們假設還有其他兩個字段,userid和username。

在SqlServer中,如果要在搜索結果中直接顯示性別的名稱SexName(不是m/f之類的代碼),使用Case When很方便。

SELECT UserID,
             UserName,
             SexName = WHEN LCASE(Sex)
            CASE 'm' THEN N'男'
            CASE 'f' THEN N'女'
            ELSE N'保密' END
FROM tUser

ACCESS不支持WHEN CASE的用法。雖然不那麼靈巧,但是用Switch可以解決這個問題。
SELECT UserID,
             UserName,
             SWITCH(
            Sex = 'f',   '男',
            Sex = 'm', '女',
            True, '保密'
            ) AS SexName
FROM tUser
上述中最後一個Case爲true,該用法類似於When Case語法中的Else。

Choose關鍵字

對於Choose關鍵字的用法,暫時沒有想到在它與SQLServer中的那個用法對應。

Choose函數的語法如下:Choose(Index,Choice_1[,Choice_2...])。其中,Index爲從1開始的整數,Choice對應的是與Index相對應的選擇項的值。

一時沒有想到太好的例子,就用上面的那個關於用戶性別的例子吧。假如上面的sex使用1替代m,代表男性,2替代f,代表女性。

SELECT UserID,
             UserName,
             IIF(CHOOSE(CINT(Sex),'男性','女性') IS NULL,
                '保密',
                CHOOSE(CINT(Sex),'男性','女性')
               ) AS SexName
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中有字段sex Text(1),用於存儲用戶性別,其中,如sex='m',用戶爲男性;sex='f',用戶爲女性;其他情況爲保密。爲了便於sql語句的說明,我們假設還有其他兩個字段,userid和username。

在SqlServer中,如果要在搜索結果中直接顯示性別的名稱SexName(不是m/f之類的代碼),使用Case When很方便。

SELECT UserID,
             UserName,
             SexName = WHEN LCASE(Sex)
            CASE 'm' THEN N'男'
            CASE 'f' THEN N'女'
            ELSE N'保密' END
FROM tUser



ACCESS不支持WHEN CASE的用法。雖然不那麼靈巧,但是用Switch可以解決這個問題。

SELECT UserID,
             UserName,
             SWITCH(
            Sex = 'f',   '男',
            Sex = 'm', '女',
            True, '保密'
            ) AS SexName
FROM tUser


上述中最後一個Case爲true,該用法類似於When Case語法中的Else。

Choose關鍵字

對於Choose關鍵字的用法,暫時沒有想到在它與SQLServer中的那個用法對應。

Choose函數的語法如下:Choose(Index,Choice_1[,Choice_2...])。其中,Index爲從1開始的整數,Choice對應的是與Index相對應的選擇項的值。

一時沒有想到太好的例子,就用上面的那個關於用戶性別的例子吧。假如上面的sex使用1替代m,代表男性,2替代f,代表女性。

SELECT UserID,
             UserName,
             IIF(CHOOSE(CINT(Sex),'男性','女性') IS NULL,
                '保密',
                CHOOSE(CINT(Sex),'男性','女性')
               ) AS SexName
FROM tUser



如果你說sex還是使用的m/f,那麼怎麼用?,可以畫蛇添足,使用Choose + Switch的嵌套啊。具體的嵌套代碼我就不寫了,沒有什麼價值,主要是在CInt(Sex)那兒嵌套,通過Switch對不同的Sex取不同的Index值。

實話實說,我還沒有發現Choose有什麼更好的意義。因爲Index對應的Choice都是索引好的,就是說需要事先定義的。相對來說,這樣就很不靈活了。索引項都是一個一個寫的(本文不討論在數據庫外生成Sql的情況),這很麻煩。功能上Switch可以滿足它的所有功能,而且更靈活,邏輯更清晰。


SELECT code,SWITCH(
            mid(code,1,len(code)-2) = '',   '0',
            True,mid(code,1,len(code)-2)
            ) AS pcode
FROM  wz_cl order by code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章