ユーザー・スキーマ・テーブル・カラム

テーブルのカラム名とデータ型を、SQLを使って動的に取得する。 - 永字八法の続き。面倒なので、VIEWにしてしまおうと思う。

SELECT pg_user.usename AS "owner", pg_namespace.nspname AS "schema", pg_class.relname AS "table", pg_attribute.attname AS "column", pg_type.typname AS "type", pg_attribute.attlen AS length
   FROM pg_namespace, pg_class, pg_attribute, pg_type, pg_user
  WHERE pg_user.usesysid = pg_namespace.nspowner AND pg_namespace.oid = pg_class.relnamespace AND pg_class.relkind = 'r'::"char" AND pg_class.oid = pg_attribute.attrelid AND pg_attribute.atttypid = pg_type.oid AND (pg_attribute.atttypid < 26::oid OR pg_attribute.atttypid > 29::oid)
  ORDER BY pg_namespace.nspowner, pg_namespace.nspname, pg_class.relname;

上記のSQLをVIEWにすると幸せかも。

ユーザー・スキーマ・テーブル・カラム

テーブルのカラム名とデータ型を、SQLを使って動的に取得する。 - 永字八法の続き。面倒なので、VIEWにしてしまおうと思う。

SELECT pg_user.usename AS "owner", pg_namespace.nspname AS "schema", pg_class.relname AS "table", pg_attribute.attname AS "column", pg_type.typname AS "type", pg_attribute.attlen AS length
   FROM pg_namespace, pg_class, pg_attribute, pg_type, pg_user
  WHERE pg_user.usesysid = pg_namespace.nspowner AND pg_namespace.oid = pg_class.relnamespace AND pg_class.relkind = 'r'::"char" AND pg_class.oid = pg_attribute.attrelid AND pg_attribute.atttypid = pg_type.oid AND (pg_attribute.atttypid < 26::oid OR pg_attribute.atttypid > 29::oid)
  ORDER BY pg_namespace.nspowner, pg_namespace.nspname, pg_class.relname;

上記のSQLをVIEWにすると幸せかも。

テーブルのカラム名とデータ型を、SQLを使って動的に取得する。

PostgreSQLのみですよー。
SELECTされるのは、カラム名とデータ型名(どちらも文字列)、それとそのカラムの長さ(数値)。
__SCHEMA_NAME__の部分にはスキーマ名を、__TABLE_NAME__の部分にはテーブル名をそれぞれ入れる。

SELECT
	pg_attribute.attname,
	pg_type.typname,
	pg_attribute.attlen
FROM
	pg_attribute,
	pg_type
WHERE
	pg_attribute.atttypid = pg_type.oid AND
	( pg_attribute.atttypid < 26 OR pg_attribute.atttypid > 29 ) AND
	attrelid IN (
		SELECT
			pg_class.oid
		FROM
			pg_class,
			pg_namespace
		WHERE
			relname='__TABLE_NAME__' AND
			pg_class.relnamespace=pg_namespace.oid AND
			pg_namespace.nspname='__SCHEMA_NAME__'
	);

ORDER BY句はお好みでどうぞ。
ちなみにカラムの長さは、VARCHARなどでは設定しない限りマイナス1になっている。

2008-10-02追記

つまるところ、PostgreSQLでは、ユーザーもスキーマもテーブルもカラムもビューもトリガーもファンクションも(以下略)システムがテーブル作ってそれに入れて管理している訳で、なのでそれらのシステムが使ってるテーブルを参照すれば、なんでもわかると言う次第です。
ちなみに他のデータベースではどんなことやってるのかは知らね。

テーブルのカラム名とデータ型を、SQLを使って動的に取得する。

PostgreSQLのみですよー。
SELECTされるのは、カラム名とデータ型名(どちらも文字列)、それとそのカラムの長さ(数値)。
__SCHEMA_NAME__の部分にはスキーマ名を、__TABLE_NAME__の部分にはテーブル名をそれぞれ入れる。

SELECT
	pg_attribute.attname,
	pg_type.typname,
	pg_attribute.attlen
FROM
	pg_attribute,
	pg_type
WHERE
	pg_attribute.atttypid = pg_type.oid AND
	( pg_attribute.atttypid < 26 OR pg_attribute.atttypid > 29 ) AND
	attrelid IN (
		SELECT
			pg_class.oid
		FROM
			pg_class,
			pg_namespace
		WHERE
			relname='__TABLE_NAME__' AND
			pg_class.relnamespace=pg_namespace.oid AND
			pg_namespace.nspname='__SCHEMA_NAME__'
	);

ORDER BY句はお好みでどうぞ。
ちなみにカラムの長さは、VARCHARなどでは設定しない限りマイナス1になっている。

2008-10-02追記

つまるところ、PostgreSQLでは、ユーザーもスキーマもテーブルもカラムもビューもトリガーもファンクションも(以下略)システムがテーブル作ってそれに入れて管理している訳で、なのでそれらのシステムが使ってるテーブルを参照すれば、なんでもわかると言う次第です。
ちなみに他のデータベースではどんなことやってるのかは知らね。

テーブルのカラム名とデータ型を、SQLを使って動的に取得する。

PostgreSQLのみですよー。
SELECTされるのは、カラム名とデータ型名(どちらも文字列)、それとそのカラムの長さ(数値)。
__SCHEMA_NAME__の部分にはスキーマ名を、__TABLE_NAME__の部分にはテーブル名をそれぞれ入れる。

SELECT
	pg_attribute.attname,
	pg_type.typname,
	pg_attribute.attlen
FROM
	pg_attribute,
	pg_type
WHERE
	pg_attribute.atttypid = pg_type.oid AND
	( pg_attribute.atttypid < 26 OR pg_attribute.atttypid > 29 ) AND
	attrelid IN (
		SELECT
			pg_class.oid
		FROM
			pg_class,
			pg_namespace
		WHERE
			relname='__TABLE_NAME__' AND
			pg_class.relnamespace=pg_namespace.oid AND
			pg_namespace.nspname='__SCHEMA_NAME__'
	);

ORDER BY句はお好みでどうぞ。
ちなみにカラムの長さは、VARCHARなどでは設定しない限りマイナス1になっている。

2008-10-02追記

つまるところ、PostgreSQLでは、ユーザーもスキーマもテーブルもカラムもビューもトリガーもファンクションも(以下略)システムがテーブル作ってそれに入れて管理している訳で、なのでそれらのシステムが使ってるテーブルを参照すれば、なんでもわかると言う次第です。
ちなみに他のデータベースではどんなことやってるのかは知らね。

UPC+EAN13+EAN8=GTINコード

ちょいと趣味的かつ専門的?な話をば。
北米圏では商品流通管理に12桁のUPCコードを使ってる。ヨーロッパ圏+日本では13桁のEAN(日本ではJANだけど事実上同じ)を使ってる。出版業界はすでにEAN圏に吸収された。(JAN8なんて鬼子もいるが、まあ一応こいつも統合されたし)
そしてUPCとEANは、GTINコードとして世界的に統合された。
まあ、そのこと自体は(そこはかとない理想主義的な香りが気になりつつも)データオタクたる俺としては諸手を挙げて歓迎すべきことなんであーだこーだは言わないのだが(てかもう移行してるし)。
EANコードUPCコードをどうやってGTINコードに変換するのかを調べてみた。
結論としては、どれでも桁数が14になるまで頭に0を追加し続けることでオーケーのようだ。JAN8でさえもそうなのだ。
逆に行うと、先頭の0の数でそれがEANかUPCかJAN8かなどが判別できると言う訳だ。
※EAN14は元々がGTINらしい……先頭の数字で、EAN13の商品がいくつ入っている商品なのかを設定できるそうだ。先頭の数字が何の時にいくつ入りになるかは、業者毎に勝手に決められるので、その辺のデータをどうやって取得するかだよなあ。
まあ、なんでこんな話をしたのかと言うと、持っているアイテムのリストをデータベース化しようと思ったら、なんと俺の部屋にはUPCの商品すらも転がっていたりして、さてこれはどうやって登録すべきかと悩んで調べてみたのですよ。
ちなみにUPCの商品は、北米版ランブルローズと北米版「もけもけ大正電動娘ARISA」だったりする。
今作ってるデータベースにgtinカラムとupcカラムを追加して、プログラムにも変更を加えることにする。

UPC+EAN13+EAN8=GTINコード

ちょいと趣味的かつ専門的?な話をば。
北米圏では商品流通管理に12桁のUPCコードを使ってる。ヨーロッパ圏+日本では13桁のEAN(日本ではJANだけど事実上同じ)を使ってる。出版業界はすでにEAN圏に吸収された。(JAN8なんて鬼子もいるが、まあ一応こいつも統合されたし)
そしてUPCとEANは、GTINコードとして世界的に統合された。
まあ、そのこと自体は(そこはかとない理想主義的な香りが気になりつつも)データオタクたる俺としては諸手を挙げて歓迎すべきことなんであーだこーだは言わないのだが(てかもう移行してるし)。
EANコードUPCコードをどうやってGTINコードに変換するのかを調べてみた。
結論としては、どれでも桁数が14になるまで頭に0を追加し続けることでオーケーのようだ。JAN8でさえもそうなのだ。
逆に行うと、先頭の0の数でそれがEANかUPCかJAN8かなどが判別できると言う訳だ。
※EAN14は元々がGTINらしい……先頭の数字で、EAN13の商品がいくつ入っている商品なのかを設定できるそうだ。先頭の数字が何の時にいくつ入りになるかは、業者毎に勝手に決められるので、その辺のデータをどうやって取得するかだよなあ。
まあ、なんでこんな話をしたのかと言うと、持っているアイテムのリストをデータベース化しようと思ったら、なんと俺の部屋にはUPCの商品すらも転がっていたりして、さてこれはどうやって登録すべきかと悩んで調べてみたのですよ。
ちなみにUPCの商品は、北米版ランブルローズと北米版「もけもけ大正電動娘ARISA」だったりする。
今作ってるデータベースにgtinカラムとupcカラムを追加して、プログラムにも変更を加えることにする。