你可以張貼一些代碼和數據請重現問題?由於這是在SQL代碼SWITCH()
那麼我認爲SQL DDL(CREATE TABLE
等)和DML(INSERT INTO
添加數據)將是最合適:)
[挑剔點:Access數據庫SQL沒有一個「布爾」數據類型。它有一個YESNO
數據類型,它可以是NULL
的值;三值邏輯不是布爾]
下面是一些SQL DML(ANSI-92 Query Mode語法)來演示運行方式如預期的我:
SELECT TYPENAME
(
SWITCH
(
NULL, #2009-01-01 00:00:00#,
FALSE, #2009-06-15 12:00:00#,
TRUE, #2009-12-31 23:59:59#
)
);
改變任何「條件」值和值總是作爲'日期'返回,即DATETIME
。
UPDATE:
這TYPENAME
功能是一個偉大的 工具...訪問似乎解釋的結果集的 整個 「列」 不同
確實。由於列只能是一種數據類型,因此行中的結果爲TYPENAME()
可能會引起誤解。混合類型的行值必須「提升」爲更高的數據類型。與Access數據庫引擎通常一樣,這個過程完全不透明,關於這個主題的文檔完全沒有,所以你只需要吮吸它就可以看到例如
SELECT #2009-01-01 00:00:00# AS row_value,
TYPENAME(#2009-01-01 00:00:00#) AS row_type
FROM Customers
UNION ALL
SELECT 0.5,
TYPENAME(0.5) AS row_type
FROM Customers
分別返回'Date'和'Decimal',但列將是什麼?顯然,答案是:
SELECT DT1.row_value, TYPENAME(DT1.row_value) AS column_type
FROM (
SELECT DISTINCT #2009-01-01 00:00:00# AS row_value
FROM Customers
UNION ALL
SELECT DISTINCT 0.5
FROM Customers
) AS DT1;
'String'?!
......這當然不是Access數據庫引擎SQL數據類型。因此,令人煩惱的是,TYPENAME()
使用了「最適合」VBA類型的名稱。例如:
SELECT TYPENAME(CBOOL(0));
返回'布爾',即使如上所述,Access數據庫引擎SQL中沒有布爾數據類型。並且
SELECT TYPENAME(my_binary_col)
返回'String'。注意,相同的VBA映射限制適用於功能(又一個煩惱),例如沒有'投到BINARY
'功能,並且自從Jet 4以來CDEC()
功能仍然中斷。0 :(
我同意嘗試IIF() – CRice 2009-10-07 01:45:02
大衛和onedaywhen雖然有趣的解釋,儘管如此,IIf的工作(我真的應該一直在使用它)首先看到我的評論onedaywhen的答案更多細節的差異,但現在,我只使用IIf – mikeh 2009-10-07 16:14:55