2017-06-26 3 views
0

Informixデータベースで使用されているタイプのレポートを作成する必要があります。Informix 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; 

そして、私が見たレポートで:

datetime 0 to 4 

私はこの0を置き換えることができますどのようdatetimeの復号化は、今私は、このようなSQLを持っているドキュメント(https://www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.sqlr.doc/ids_sqr_027.htm

に応じて少し派手ですyear4dayはSQLのみを使用していますか?私はちょうど同じようCASEに連結する文字列でCASEを追加しようとしました:

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

が、私は構文エラーを得ました。

SQLでも可能ですか?

+0

あなたは既に大文字表記の中にいます...あなたは別の表情を開始する予定ですか? ** when **条件を変更する必要があります。 –

答えて

0

CASE文の両方のバリアントの正しい構文は次のとおりです。

CASE … END 

なく

CASE … END CASE 

CASE expressionsを参照してください。

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

が働くだろう:

したがって、それは可能性があります。少なくとも、同じ原因から構文エラーを生成すべきではありません。


私はこのSQLをほとんど維持できないとみなしています。確かに1回以上作成されるべきではありません。おそらく、ストアドプロシージャに書き込むほうがよいでしょう。

あなたはどちらか、すでにInformixの中に、このようなストアドプロシージャを見つけることができるはずです(ifx_param_typesおよび関連機能;あなたは$INFORMIXDIR/etc.sqlファイルにその定義を見つけることができます - しかし、それらの数は、システムで提供されているCのUDRのを呼び出します) 、またはInternational Informix User Group(IIUG)のWebサイトのツールで使用できます。たとえば、私のSQLCMDには、ジョブを実行する 'ESQL/C'コード(実際にはいくつかのESQL/Cヘッダーを使用するCコード)があります。esqltype.ecがそのファイルです。

関連する問題