例えば以下のようなテーブルがあった場合に、
select した結果を以下のようにしたいです。
sql
1create table Employee ( 2 CompanyId 文字列型, -- 会社ID 3 EmployeeId 文字列型, -- 社員ID 4 EmployeeName 文字列型, -- 社員名 5)
結果
会社ID | 社員ID | 社員名 |
---|---|---|
00001 | A000000001 | 田中 |
もちろん手動で列名をエイリアスで定義したら出来ますが、
列のコメントを取得して、それをエイリアスにする方法がありますでしょうか?
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_NAME | COLUMN_NAME | COMMENT |
---|---|---|
Employee | CompanyId | 会社ID |
Employee | EmployeeId | 社員ID |
Employee | EmployeeName | 社員名 |
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
結果
c1 | c2 | c3 |
---|---|---|
会社ID | 社員ID | 社員名 |
00001 | A000000001 | 田中 |