ユーザー・スキーマ・テーブル・カラム
テーブルのカラム名とデータ型を、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カラムを追加して、プログラムにも変更を加えることにする。