質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

12925閲覧

select した際に、列の別名に列コメントを指定できるデータベースはありますか?またはその方法 ※PL/SQL, プログラムでの動的生成は除く

tec

総合スコア9

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1グッド

1クリップ

投稿2018/08/30 02:19

編集2018/08/30 07:44

例えば以下のようなテーブルがあった場合に、
select した結果を以下のようにしたいです。

sql

1create table Employee ( 2 CompanyId 文字列型, -- 会社ID 3 EmployeeId 文字列型, -- 社員ID 4 EmployeeName 文字列型, -- 社員名 5)

結果

会社ID社員ID社員名
00001A000000001田中

もちろん手動で列名をエイリアスで定義したら出来ますが、
列のコメントを取得して、それをエイリアスにする方法がありますでしょうか?

sql

1select 2 CompanyId as 会社ID 3, EmployeeId as 社員ID 4, EmployeeName as 社員名 5from Employee 6 7ではなくて、、、 8 9select 10 CompanyId as [Employee.CompanyIdのコメント] 11, EmployeeId as [Employee.EmployeeIdのコメント] 12, EmployeeName as [Employee.EmployeeNameのコメント] 13from Employee 14 15として、[]内をSQL結果等から引っ張って設定したいです。

追記

データベースの種類やバージョンの指定等は特にありません。
ただ、PL_SQLや、プログラム上でSQLを構築する方法ではなくて、
一回のSQLでエイリアス名の設定を含めて取得することが出来るのかを知りたかったのです。
※そのため、create table の構文を、「varchar2」指定していたのを「文字列型」と編集しました。

例えばSQLServerの書き方だと、以下の方法でEmployeeテーブルの列のコメントを取得できましたが、
「extended_properties.value」の値を、エイリアス名として指定した上でSQLで取得できるのか?ということです。

sql

1select 2 tbl.name as TABLE_NAME 3 ,col.name as COLUMN_NAME 4 ,ep.value as COMMENT 5from sys.tables tbl 6inner join sys.columns col 7 on col.object_id = tbl.object_id 8inner join sys.extended_properties ep 9 on ep.major_id = col.object_id 10 and ep.minor_id = col.column_id 11where 12 tbl.name = 'Employee'

結果

TABLE_NAMECOLUMN_NAMECOMMENT
EmployeeCompanyId会社ID
EmployeeEmployeeId社員ID
EmployeeEmployeeName社員名

sql

1-- エイリアス部分を一回のSQLでなんらかの方法で指定する方法があるのか知りたいのです。 2select 3 CompanyId as [case data.COLUMN_NAME='CompanyId' then data.COMMENT else '' end] 4, EmployeeId as [if(data.COLUMN_NAME="EmployeeId") data.COMMENT] 5, EmployeeName as [data.COMMENT] 6from Employee, 7( 8 select 9 tbl.name as TABLE_NAME 10 ,col.name as COLUMN_NAME 11 ,ep.value as COMMENT 12 from sys.tables tbl 13 inner join sys.columns col 14 on col.object_id = tbl.object_id 15 inner join sys.extended_properties ep 16 on ep.major_id = col.object_id 17 and ep.minor_id = col.column_id 18 where 19 tbl.name = 'Employee' 20) data 21

追記②
やってみたこと@SQLServer

sql

1with t1 (c1, c2, c3) 2as( 3 select 4 max(case when col.column_id = 1 then ep.value end) 5 , max(case when col.column_id = 2 then ep.value end) 6 , max(case when col.column_id = 3 then ep.value end) 7 from sys.tables tbl 8 inner join sys.columns col 9 on col.object_id = tbl.object_id 10 inner join sys.extended_properties ep 11 on ep.major_id = col.object_id 12 and ep.minor_id = col.column_id 13 where 14 tbl.name = 'Employee' 15 group by 16 tbl.name 17) 18select 19 t1.c1 20, t1.c2 21, t1.c3 22from t1 23 24union all 25 26select 27 CompanyId 28, EmployeeId 29, EmployeeName 30from Employee

結果

c1c2c3
会社ID社員ID社員名
00001A000000001田中
ssatoh17👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SE-studying-now

2018/08/30 02:43

どのSQLでどのバージョンかで実現方法が変わることもあります。本文に追記頂ければと思います。
tec

2018/08/30 03:01

コメントありがとうございます。特にDBの指定やバージョンも何もありませんが、一回のSQLで取得できるか?ということが知りたかったのです。
nandymak

2019/09/19 22:13

何故その様なことをする必要があるかを記載すれば妙案が提示されるかもしれません。
guest

回答2

0

メジャーRDBとして、Oracle、SQL Server、DB2、MySQL、PostgreSQLなどがありますが、カラムのコメントや説明の実装はまちまちです。
標準SQL規格はありますが、20年近く前に策定されたSQL99ですらメジャーRDB間で完全互換とは言えないのが現状です。
ですから汎用的な方法はありません。

投稿2018/08/30 03:31

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tec

2018/08/30 04:24

回答ありがとうございます。 汎用的な方法はないのですね。 どのDBでも良いので、1SQLにて列コメントをエイリアスとして利用するSQLをかけるDBはあるのでしょうか?
hihijiji

2018/08/30 04:44

出来ないことは無いでしょうけど汎用的とは対極的なアクロバティックな実装になるのでお勧めしません。 表現型はクライアントの仕事とするのが吉です。
tec

2018/08/30 04:49

出来るDBがあるんですね! どのような書き方をすれば良いのでしょうか? もしくは、どの様なキーワードで探し出せば良いのでしょうか? 「SQL エイリアス 動的」で調べても出来ないか、PL_SQLの回答ばかりでしたので。
hihijiji

2018/08/30 04:57

WITH句が使えるRDBMSなら、WITH句のサブクエリをつなげていけばいかようにも出来そうです。 変な実装になるので書きたくはありませんが^^;
tec

2018/08/30 06:19 編集

追記②として新たにWith句を利用したSQLを作ってみましたが、 **データ上**では期待した様な結果なのですが、 結局列名が(c1,c2,c3)となってしまいました。 ここから何をどうしたら良いでしょうか? WITH句内で一時テーブルを作成しようとするのはシステム的にNGでした -- 以下はNG with t2 as ( create table #TEMP t1.c1 文字列型, t2.c2 文字列型, )
hihijiji

2018/08/30 07:20

そこの部分は、Pivotで… 勧めるわけではありませんが
guest

0

varchar2型とありますから Oracle でしょうけど、同じSQLでもデータベースによって方言が大きいですから、どのデータベースを使うのかを質問のタグで明示したり、バージョンも明記した方が適切なコメントが付き易いです。

本題で、カラムの定義は USER_TAB_COLUMNS
カラムのコメントは USER_COL_COMMENTS を参照します。
コメントを列の別名とするときはダブルクォートで囲みましょう。

追記
データベースはOracleを前提として、
通貨コード のテーブル定義を利用。

Excelで1行目にコメントを使いたいものと想定。sqlplus から
--テーブル名は置換変数で
DEFINE tbl=CURRENCIES

SET HEADING OFF
SET PAGESIZE 0
SELECT DISTINCT
'COLUMN ' || TC.COLUMN_NAME || ' HEADING "' || CM.COMMENTS || '"' AS "COLUMN"
FROM USER_TABLES TA
INNER JOIN USER_TAB_COLUMNS TC
ON TC.TABLE_NAME = TA.TABLE_NAME
INNER JOIN USER_TAB_COLUMNS TC
ON TC.TABLE_NAME = TA.TABLE_NAME
LEFT OUTER JOIN USER_COL_COMMENTS CM
ON CM.TABLE_NAME = TC.TABLE_NAME
AND CM.COLUMN_NAME = TC.COLUMN_NAME
WHERE
TA.DROPPED = 'NO' -- except trash box, since oracle10.1.0
AND TA.TABLE_NAME = '&&tbl'
;
-- の結果をリダイレクト(sqlplusで再実行)
SET COLSEP ','
SPOOL &&tbl..csv
SELECT * FROM &&tbl ;
SPOOL OFF

投稿2018/08/30 02:34

編集2018/08/30 22:33
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tec

2018/08/30 04:28

回答ありがとうございます。 DBに関しては特に指定はありませんでした。 Oracleでは列のエイリアスに対して、USER_COL_COMMENTS.COMMENTS を利用することはできますか?
Orlofsky

2018/08/30 05:54

データベースが何かやバージョンは最初に確認した方がいいです。 >Oracleでは列のエイリアスに対して、USER_COL_COMMENTS.COMMENTS を利用することはできますか? できます。
tec

2018/08/30 07:20 編集

すみません、確認する必要がない。。。というか、実行可能なデータベースがあるのかと、その実行方法が聞きたかったので記述しませんでした。 以下のようなSQLでは当然上手くいくはずもないですし、 2013年時点でのStackOverflowですが同様の質問をされた方がいて、 その時点での回答ではプログラム上でSQLを組み立てろということでした。 https://stackoverflow.com/questions/15451704/output-comments-columns-instead-of-the-column-names どの様にしたら実現できるのですか? select CompanyId As " case when COLUMN_NAME = 'CompanyId' then COMMENTS end " , EmployeeId As " case when COLUMN_NAME = 'EmployeeId' then COMMENTS end " , EmployeeName As " case when COLUMN_NAME = 'EmployeeName' then COMMENTS end " from Employee , USER_COL_COMMENTS where table_name = 'Employee'
Orlofsky

2018/08/30 22:43

回答にOracleでの方法を追記しましたが、質問の内容がだいぶ変わってきたので、希望される回答とは変わっているようです。 Oracleを使うならPL/SQLもきちんと勉強してください。 SQLはLOOPはできませんが、PL/SQLはLOOPも使えます。最近パフォーマンス・チューニングで呼ばれると、SQLとJavaで作っていて、何千万件もあるデータを1件ずつ処理しているので時間がかかり過ぎていて、PL/SQLで作り直すと処理時間が十分の一になることもザラです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問