Не могли бы вы опубликовать код и данные, чтобы воспроизвести проблему, пожалуйста? Так как это SWITCH()
в коде SQL, то я думаю, что SQL DDL (CREATE TABLE
и т. Д.) И DML (INSERT INTO
для добавления данных) будут наиболее подходящими:)
[Точный пункт: SQL базы данных Access не имеет логического типа данных. Он имеет тип данных 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 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
возвращает '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;
'Строка'?!
... что, конечно, даже не тип данных SQL Access Database Engine. Так что TYPENAME()
, к сожалению, использует имя типа VBA «наилучшее соответствие». Например:
SELECT TYPENAME(CBOOL(0));
возвращает логическое значение, даже если, как обсуждалось выше, логический тип данных в SQL Access Engine Engine отсутствует. И
SELECT TYPENAME(my_binary_col)
возвращает 'String'. Обратите внимание, что то же ограничение отображения VBA применяется к функциям CAST
(еще одно раздражение), например. нет функции приведения к BINARY
и функция CDEC()
не работает с Jet 4.0: (