問題を再現するためのコードとデータを投稿していただけますか?これはSQLコードにあるので、SQL DDL(など)とDML(データを追加するため)が最も適切SWITCH()
だと思います:)CREATE TABLE
INSERT INTO
[要点:AccessDatabaseSQLには「ブール」データ型がありません。値にYESNO
なり得るデータ型があります。NULL
3値論理はブール値ではありません。]
SQL DML(ANSI-92クエリモード構文)を使用して、期待どおりに機能することを示します。
SELECT TYPENAME
(
SWITCH
(
NULL, #2009-01-01 00:00:00#,
FALSE, #2009-06-15 12:00:00#,
TRUE, #2009-12-31 23:59:59#
)
);
'criterion'値のいずれかを変更すると、値は常に' Date'、つまりタイプが返されDATETIME
ます。
アップデート:
そのTYPENAME
関数は素晴らしいツールです...Accessは結果セットの「列」全体を異なる方法で解釈するようです
それはそう。列は1つのデータ型にしかなり得ないためTYPENAME()
、行の結果は誤解を招く可能性があります。混合型の行の値は、より高いデータ型に「プロモート」する必要があります。Access Database Engineで通常行われているように、プロセスは完全に不透明であり、主題に関するドキュメントは完全に欠落しているため、それを吸い込んで、たとえば
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
それぞれ「日付」と「小数」を返しますが、列はどうなりますか?どうやら、答えは次のとおりです。
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;
'弦'?!
...もちろん、これはAccessDatabaseEngineのSQLデータ型でもありません。したがってTYPENAME()
、厄介なことに、「最適な」VBAタイプの名前を使用します。例えば:
SELECT TYPENAME(CBOOL(0));
上記のように、Access Database Engine SQLにブールデータ型がない場合でも、「ブール」を返します。と
SELECT TYPENAME(my_binary_col)
'String'を返します。同じVBAマッピングの制限がCAST
関数に適用されることに注意してください(さらに別の煩わしさ)。たとえば、「キャスト先BINARY
」関数はなく、 CDEC()
Jet4.0以降関数は壊れたままです:(