2017-06-26 2 views
0

Je veux faire un rapport des types utilisés dans la base de données Informix. Décodage de datetime est un peu de fantaisie selon la documentation (https://www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqlr.doc/ids_sqr_027.htm)CASE est-il possible de concaténer des chaînes dans le langage SQL Informix?

Maintenant, j'ai comme SQL:

SELECT COUNT(*), 
CASE MOD(coltype, 256) 
    WHEN 0 THEN 'char' 
    WHEN 1 THEN 'smallint' 
    WHEN 2 THEN 'integer' 
    WHEN 3 THEN 'float' 
    WHEN 4 THEN 'smallfloat' 
    WHEN 5 THEN 'decimal(' || (collength/256)::int || ', ' || mod(collength, 256) || ')' 
    WHEN 6 THEN 'serial' 
    WHEN 7 THEN 'date' 
    WHEN 8 THEN 'money(' || (collength/256)::int || ', ' || mod(collength, 256) || ')' 
    WHEN 9 THEN 'null' 
    WHEN 10 THEN 'datetime ' || substr(hex(collength), -2, 1) || ' to ' || substr(hex(collength), -1, 1) 
    WHEN 11 THEN 'byte' 
    WHEN 12 THEN 'text' 
    WHEN 13 THEN 'varchar' 
    WHEN 14 THEN 'interval' 
    WHEN 15 THEN 'nchar' 
    WHEN 16 THEN 'nvarchar' 
    WHEN 17 THEN 'int8' 
    WHEN 18 THEN 'serial8' 
    WHEN 19 THEN 'set' 
    WHEN 20 THEN 'multiset' 
    WHEN 21 THEN 'list' 
    WHEN 22 THEN 'row (unnamed)' 
    WHEN 23 THEN 'collection' 
    WHEN 40 THEN 'lvarchar fixed-length opaque types' 
    WHEN 41 THEN 'blob, boolean, clob variable-length opaque types' 
    WHEN 43 THEN 'lvarchar (client-side only)' 
    WHEN 45 THEN 'boolean' 
    WHEN 52 THEN 'bigint' 
    WHEN 53 THEN 'bigserial' 
    WHEN 2061 THEN 'idssecuritylabel' 
    WHEN 4118 THEN 'row (named)' 
    ELSE '???' 
END CASE 
FROM syscolumns, systables 
WHERE tabtype='T' 
AND systables.tabid >= 100 
AND tabname[1] <> '_' 
AND syscolumns.tabid = systables.tabid 
GROUP BY 2 
ORDER BY 1 desc, 2; 

Et dans les rapports que je vois:

datetime 0 to 4 

Comment puis-je remplacer 0 à year et 4 à day en utilisant SQL uniquement? J'ai essayé d'ajouter CASE dans la chaîne concaténer en CASE tout comme:

... 
WHEN 10 THEN 'datetime ' || substr(hex(collength), -2, 1) || ' to ' || case substr(hex(collength), -1, 1) when '4' then 'day' else '?' end case 
... 

mais je suis erreur de syntaxe.

Est-ce possible en SQL seulement?

+0

Vous êtes déjà dans une expression de cas ... et vous prévoyez d'en commencer une autre? Vous devez modifier la condition ** quand ** pour inclure ** quand 10 et ... ** –

Répondre

0

La syntaxe correcte pour les deux variantes d'une instruction CASE est:

CASE … END 

et non

CASE … END CASE 

Voir CASE expressions.

Ainsi, il est possible que:

WHEN 10 THEN 'datetime ' || SUBSTR(HEX(collength), -2, 1) || ' to ' || 
      CASE SUBSTR(HEX(collength), -1, 1) WHEN '4' THEN 'day' ELSE '?' END 

fonctionnerait. Il ne devrait pas générer une erreur de syntaxe de la même cause, au moins.


Je considère que SQL est en grande partie impossible à maintenir. Il ne devrait certainement pas être créé plus d'une fois. Vous feriez probablement mieux de l'écrire dans une procédure stockée.

Vous devriez être en mesure de trouver de telles procédures stockées soit déjà Informix (ifx_param_types et fonctions connexes, vous pouvez trouver leurs définitions dans les .sql fichiers dans $INFORMIXDIR/etc - mais un certain nombre d'entre eux invoquer C UDRs qui sont fournis avec le système) ou dans les outils du site Web International Informix User Group (IIUG). Par exemple, mon SQLCMD a le code 'ESQL/C' (vraiment le code C en utilisant certains en-têtes ESQL/C) qui fait le travail - esqltype.ec est le fichier pour cela.