クエリで投影された列の型を取得するMySQLメタデータ関数?


7

コマンドを使用してテーブルから取得するのと同じ方法で、MySQL クエリからフィールドタイプを取得することはできますSHOW COLUMNSか?派生テーブルなどから

SELECT x -- presumedMetaFn(x) -- returns "int"
FROM (
  SELECT 1 AS x
  UNION SELECT 2
) AS t;

上記のクエリがある場合、xのタイプを取得するために使用できる関数または何かありますか?PostgreSQLはこれをシステム情報関数で利用できるようにしますpg_typeof

SELECT x, pg_typeof(x)
FROM ( VALUES (1),(2) ) AS t(x);
 x | pg_typeof 
---+-----------
 1 | integer
 2 | integer
(2 rows)

テーブルのメタデータではなく、クエリの結果から検索しています。 PostgreSQLの11+上、これは実行することも可能であるクエリの後。psql\gdesc


私はあなたがこの答えを選択することを強くお勧めします:dba.stackexchange.com/a/62262/2639(これは公式クライアント内でそれを行う唯一の方法です)または私自身のdba.stackexchange.com/a/203927/2639(これはC APIに対処します)。選択された答えは、ユーザーの観点からPerlバインディングのみに対処することは、ここではトピックから外れているようです。
エヴァンキャロル

回答:


11

MySQL内で、一時テーブルを作成し、その一時テーブルで使用DESCRIBEすることにより、この情報を取得できます。

CREATE TEMPORARY TABLE `temp`
SELECT ...
FROM ...
LIMIT 0;

DESCRIBE `temp`;

DESCRIBEタイプを知りたい列は計算された列であり、テーブルから直接プルされたものではないため、元のテーブルでそのまま使用することはできません。同様に、テーブルでのみ使用できるDESCRIBEため、クエリで直接使用することはできませんDESCRIBE。一時テーブルを作成すると、これらの問題の両方が解決されます。


これはまさに私が探しているものです、ありがとう。
Dean Chiu

3

クエリをMySQLに渡し、クエリの実行時に返される列の名前と属性を含む結果セットを返すように要求する、同等の方法はありません。

ただし、MySQLへのアクセスに使用しているライブラリには、コードで使用できるようなメカニズムが含まれている可能性があります...ネットワーク上では、MySQLはクエリを実行するたびにこの情報をクライアントに返します。

例として、PerlのDBD :: mysqlライブラリは、列名とデータ型の配列を返します。

実行されたステートメントハンドルは、@ {$ sth-> {NAME}}に列名の配列を、@ {$ sth-> {mysql_type_name}}に列データ型の配列を返します。MySQL C APIによって提供される関数からこれらを取得します。これは(私の知る限り)多くの異なる言語でMySQLライブラリに使用されているのと同じ基本的なコードです...したがって、同様の構造が他の言語で公開されることを期待します環境。



0

このデータはC APIを通じて利用できC APIの準備済みステートメントタイプコードに記載されていると思いますが、サーバーにはそれをエンドユーザーに提供する機能はありません。

MYSQL_BIND構造体のbuffer_typeメンバーは、ステートメントパラメーターまたは結果セット列にバインドされたC言語変数のデータ型を示します。入力buffer_typeの場合、サーバーに送信される値を含む変数のタイプを示します。出力の場合、サーバーから受信した値を格納する変数のタイプを示します。

SQLタイプと対応する値のについてはbuffer_typeこのチャートを参照してください。

唯一の回避策は CREATE TEMPORARY TABLE AS SELECT (CTAS) ... DESCRIBE


-1

私が読んだ質問は、データベーステーブルの列ではなく、結果セットの列の詳細を取得することです。

PHPを使用している場合は、MYSQLIおよびPDOを使用してデータベースにアクセスするための組み込み関数があり、(元のテーブルの列ではなく)クエリ結果の列に関する詳細情報(データタイプなど)を提供できます。 。

これらのメソッドの詳細については、PHPのドキュメントを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.