Pouvez-vous envoyer un code et des données reproduire le problème, s'il vous plaît? Comme cela est SWITCH()
dans le code SQL, alors je pense que SQL DDL (CREATE TABLE
etc) et DML (INSERT INTO
pour ajouter des données) seraient les plus appropriés :)
[Point Picky: base de données Access SQL ne dispose pas d'un type de données 'boolean' . Il a un type de données YESNO
qui peut être la valeur NULL
; logique à trois valeurs est non booléenne]
Voici quelques SQL DML (ANSI-92 Query Mode syntaxe) pour montrer comment il fonctionne comme prévu pour moi.
SELECT TYPENAME
(
SWITCH
(
NULL, #2009-01-01 00:00:00#,
FALSE, #2009-06-15 12:00:00#,
TRUE, #2009-12-31 23:59:59#
)
);
Modifiez les valeurs « critère » et la valeur est toujours retourné en tant que 'Date' ie de type DATETIME
.
MISE À JOUR:
Cette fonction TYPENAME
est un excellent outil ... L'accès semble interpréter la "colonne" entière du resultset différemment
En effet. Étant donné qu'une colonne ne peut être qu'un type de données, les résultats de TYPENAME()
sur la ligne peuvent être trompeurs. Les valeurs de ligne de types mixtes doivent être «promues» à un type de données supérieur. Comme d'habitude avec le moteur de base de données Access, le processus est entièrement opaque et la documentation sur le sujet est complètement absente, donc vous devez juste le sucer et voir par exemple.
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
rendements Date »et « décimal » respectivement, mais ce sera la colonne être? Apparemment, la réponse est:
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' ?!
... ce qui bien sûr n'est même pas un type de données Access Database Engine SQL. Donc, TYPENAME()
, de manière agaçante, utilise le nom du type VBA 'best fit'. Par exemple:
SELECT TYPENAME(CBOOL(0));
retourne 'Boolean', même si, comme indiqué plus haut, il n'y a aucun type de données Boolean dans Access Database Engine SQL. Et
SELECT TYPENAME(my_binary_col)
renvoie 'Chaîne'. Notez que la même limitation de mappage VBA s'applique aux fonctions CAST
(encore une autre gêne), par ex. il n'y a pas de fonction 'cast to BINARY
' et la fonction CDEC()
reste brisée depuis Jet 4.0 :(
Je suis d'accord essayez IIF() – CRice
David's et unedayquand, malgré les explications intrigantes, le IIf a fonctionné (et j'aurais vraiment dû l'utiliser en premier lieu.) Voir mon commentaire onedaywhen la réponse pour plus de détails de la différence , mais pour l'instant, je vais juste utiliser IIf: – mikeh