• ベストアンサー
  • すぐに回答を!

PostgreSQLのカラムに"user"という名前のカラムがある場合のデータ表示について

PostgreSQLを使い始めたのですが、わからないことがあるので知恵をおかしください。 ユーザー名を管理するテーブルを以下のように作成しました。 テーブル:table  |No|user|from |  |1 |Atom|tokyo|  |2 |Boss|izu |  |3 |Cat |chiba| このテーブルのデータをuser部分のみ表示するに以下のSQL文を作成しました。  SELECT user FROM table 上記のSQLを実行したのですが、userのカラム部分がcurrent_userとテーブルのカラムではなくセッションの情報を取得してきてしまいます。 試しに  SELECT * FROM table で実行するとテーブルのデータを取得でき、  SELECT table.user FROM table で実行するとsyntax errorとエラー表示されデータが結果が表示されません。 userをセッション情報としてではなく、テーブル(table)のデータとして取得したい場合はどのようにしたらいいのでしょうか? よろしくお願いします。

共感・応援の気持ちを伝えよう!

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

「user」が予約語になっているからでしょう。 「select "user" from table」のように、「"」(ダブルクォーテーション)で囲んでみて下さい。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

「"」(ダブルクォーテーション)で囲んだら無事データ取得できました! 「user」は予約語なんですね^^; 大変勉強になりました。 ありがとうございました。

関連するQ&A

  • 同一SQLでも実行ユーザによりカラム表示をマスクしたい

    現在はアクセス制限していないAccessからのODBC接続による処理が多数あるのですが、セキュリティの観点から同一SQLを実行した場合でもユーザにより表示される項目を抑制したいと思っています。 重要情報のカラムは、管理者はデータ値で見えるけど、一般ユーザは「表示不可」とかにしたいです。(具体的には下記イメージ) これを実現する上で、既存のAccessに手を加えることなく実現できる方法は無いかを探しています。 テーブル:TBL01(所有者:u01)に、「氏名」と「口座番号」のカラムがあるとし、 Select * from TBL01;を実行した場合、 <管理者>        <一般ユーザ> 氏名 口座番号      氏名 口座番号 -- ----      -- ---- A氏 12345678      A氏 表示不可 B氏 99999999      B氏 表示不可 となるようにしたい 所有者u02,u03で夫々以下の様なViewを作り、実行ユーザにViewのSelect権限を与えれば出来るかと考えました。 u02で: create view u02.TBL01 (氏名,口座番号) as select * from u01.TBL01; u03で: create view u03.TBL01 (氏名,口座番号) as select 氏名,'表示不可' from u01.TBL01; Viewのselect権限付与: 管理者(u04)と一般ユーザ(u05)に対して grant select on u02.TBL01 to u04; grant select on u03.TBL01 to u05; とすれば、上手くいくのではないかと考えていました。 しかしAccessからのODBC接続の場合、'所有者'.'オブジェクト'(例にそうとu01.TBL01)という形でSQLが格納される様なので、上記の方法では実現できません。 違った視点から、カラムの暗号化が使えないか?とか、一般ユーザのselect権限にカラム指定をしてアクセス不可のカラムを外すとかも考えましたが、出来そうもありませんでした。 面倒な質問で申し訳ございませんが、良い案をご教授いただければ助かります。

  • 複数テーブルから全データ取得する際、同カラムあり

    SELECTで複数テーブルから、全カラム値を取得する際、同名カラムがあったとき、指定テーブルの値を取得したいのですが、どうすれば良いでしょうか? ◆前提 ・テーブル「r1」 ・テーブル「t1」 ・テーブル「u1」 ※「r1」「u1」には、同名カラム「z2」あり ◆やりたいこと ・条件一致する全てのデータを取得したい ・但し、「z2」カラムの値は、「r1」テーブルの値を取得したい ◆現状 $sql="SELECT * FROM (`r1`) JOIN `t1` JOIN `u1` ON `r1`.`tid` = `t1`.`tid` And`r1`.`uid` = `u1`.`uid`"; ◆疑問 3つのテーブルから条件一致するデータを全て取得しているのですが、 「r1テーブル」「u1テーブル」に同じカラム名(z2)があるためか、 取得結果のz2内容が、「u1テーブル」の「z2カラム」値となっています(多分…)。 この時、「r1テーブル」の「z2カラム」を取得するには、どうすれば良いでしょうか? (「r1テーブル」の「z2カラム」だけを単独で取得したいわけではなく、「SELECT * 」結果した際の「z2カラム」の値を「r1テーブル」のものにしたいです)

    • ベストアンサー
    • MySQL
  • PHPでPostgreSQLのテーブルを表示できない

    phpPgAdminでテーブルを作成し、 WEBからアクセスしようとして以下のPHPファイル(1)を作成しました。 すると以下のエラーメッセージ(1)が出て テーブルが表示されませんでした。 そこでPHPファイルを(2)のように変更したら エラーメッセージ(2)が出てテーブルが表示されませんでした。 ********************************************************** エラーメッセージ(1) permission denied for relation テーブル名 ********************************************************** PHPのファイル(1) ********************************************************** <?php $sv = "ホスト名"; $dbname = "DB名"; $user = "ユーザ名"; $pass = "パスワード"; $conn = pg_connect("host=$sv dbname=$dbname user=$user password=$pass") or die("接続エラー"); $sql = "select * from テーブル2;"; ********************************************************** エラーメッセージ(2) parse error, unexpected T_STRING ********************************************************** 変更後のPHPのファイル(2) ********************************************************** <?php $sv = "ホスト名"; $dbname = "DB名"; $user = "ユーザ名"; $pass = "パスワード"; ↓↓↓↓ここを加えた↓↓↓↓↓ GRANT ALL ON tbl_pv4 TO ユーザ名; GRANT ALL ON tbl_pv4 TO nobody; $conn = pg_connect("host=$sv dbname=$dbname user=$user password=$pass") or die("接続エラー"); $sql = "select * from テーブル2;"; ********************************************************** ちなみにテーブル2の代わりに前任者が作成したテーブルに変更すると問題なく表示されます。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • お世話になってます。

    お世話になってます。 SQL初心者です。 現在、ORACLEでSQLを作成しているのですが、「ORA-00920」と「ORA-02063」が 発生し困っています。 「ORA-02063」の原因は調べてみると「ORA-00920」が原因の可能性があるみたいです。 「ORA-00920」のメッセージには「関係演算子が無効です。」とありますが、 調べてみてもよくわかりません。 実行するSQLは以下のような感じです。 ■SQL文 with テーブルA as( SELECT文   取得カラムA, 取得カラムB, 取得カラムC ), テーブルB as(   取得カラムA, 取得カラムB, 取得カラムC ) SELECT * FROM テーブルA A_TABLE, テーブルB B_TABLE WHERE A_TABLE.取得カラムA = B_TABLE.取得カラムA (+) AND A_TABLE.取得カラムB = B_TABLE.取得カラムB (+) AND A_TABLE.取得カラムC = B_TABLE.取得カラムC (+) ***ココマデ*** ビューの作成はうまくいっているのですが、 テーブルAとテーブルBを使用したSQL文でエラーになっているようです。

  • テーブル名をカラムとして取得する方法

    テーブル名をカラムとして取得する方法はありますでしょうか? オラクル8とVB6でプログラムを組んでいます。 例 TABLE Aの内容 カラム1 1 2 3 TABLE B カラム1の内容 4 5 6 SQLは簡略化してかきます。下記のSQLを実行した場合、 select A.カラム1 from A union select b.カラム1 from b 1 2 3 4 5 6 を取得できます。 例えば、上記で、SQL実行後、 下記のような値を取得したいです。 1 ,Aのテーブルだよ 2 ,Aのテーブルだよ 3 ,Aのテーブルだよ 4 ,Bのテーブルだよ 5 ,Bのテーブルだよ 6 ,Bのテーブルだよ それぞれのテーブルの名前を別名で結果に格納したいのです。 何か方法はありますでしょうか? なければ、unionせずに、2回SQLを発行し、それぞれに、 プログラム上で、「Aのテーブルだよ」を後で挿入したいと思っています。

  • 複数のテーブルからデータを取得したい

    1つのテーブルから重複したデータを取り除いて表示するときに使う 【select distinct カラム名 from テーブル名;】 がありますよね。 それと同じようなことを複数のテーブルをまたいで行いたいのですがうまくいきません。 ちなみに両方のテーブルのカラム名は同じです。 【select distinct カラム名 from テーブル1 union select distinct カラム名 from テーブル2;】 としても重複を取り除いた後にテーブルを結合してるので結果的に両テーブルの重複した値を取り除くことができず。 そこで 【select distinct T1.カラム名, T2.カラム名 from テーブル1 T1. テーブル2 T2;】 としてみたのですが、クエリを実行中のまま反応がないので悩んでます。 ちなみに2つのテーブルのデータはそれぞれ2万件ほどです。 こういう時どういうsql文を組むのが正しいのでしょうか?

    • ベストアンサー
    • MySQL
  • TIMESTAMP型が含まれるテーブルの列名の取得

    Oracle 11gを使用しているSQL初心者です。 テーブルの列名を取得する方法についての質問です。 テーブルの列名を取得するときは以下のSQLで取れると思っています。 select column_name from user_tab_columns where table_name = 'テーブル名'; --実行結果-- COLUMN_NAME ------------------------------ NAME1 NAME2 しかし、テーブルにTIMESTAMP型が含まれていると 「レコードが選択されませんでした。」 と表示されます。 TIMESTAMP型が含まれるテーブルは上記のSQLでは取得できないのでしょうか。 TIMESTAMP型が含まれるテーブルの列名の取得方法をご存知の方がいらっしゃいましたら、 ご教示ください。よろしくお願い致します。

  • Accessのクエリで複数カラムの最大値表示

    Accessのクエリで複数カラムの中から最大のカラムデータを表示させる方法をお教えください。 テーブル名:TBL カラムA,B,Cがあっていずれも整数です。 カラムA,B,Cの最大のデータを表示したいのです。 データの例 A B C 10 14 12 → 14 21 18 19 → 21 15 11 17 → 17 このときSQL文でいえば次のようにすればできるのでしょうが、IF関数2回使わないで一発で最大値を表示させられないでしょうか。 Select iif(A>=B,A,B) as D, iif(D>=C,D,C) as E from TBL; Select Max(A,B,C) as D from TBL; のようなのがないでしょうか?

  • カラム情報(主キー、データ型、桁数等)を取得するには

    テーブルに格納されているカラム情報(カラム名、主キー、データ型、データの桁数)を取得したいと考えています。 主キー情報とそれに付随するカラム情報は現在下記のSQL文で取得しています。 SELECT C.TABLE_NAME , COL.COLUMN_NAME, C.CONSTRAINT_TYPE, COL2.DATA_TYPE, COL2.DATA_LENGTH FROM USER_CONSTRAINTS C, USER_CONS_COLUMNS COL, USER_TAB_COLUMNS COL2 WHERE C.TABLE_NAME = COL.TABLE_NAME AND C.CONSTRAINT_NAME = COL.CONSTRAINT_NAME AND C.TABLE_NAME = COL2.TABLE_NAME AND COL.COLUMN_NAME = COL2.COLUMN_NAME AND C.CONSTRAINT_TYPE = 'P' AND UPPER(C.TABLE_NAME) = UPPER('テーブル名') ORDER BY C.TABLE_NAME, COL.POSITION ここで、主キー以外のカラムに対しても同様にカラム情報を取得したいのですが、どのように取得すればよろしいでしょうか? ※カラム名、主キー有無、データ型、桁数 でカラム情報を取得できれば最も良いのですが、 主キー情報を除いた全体のカラム情報を取得する事ができれば、こちらの情報でも助かります 宜しくお願い致します。

  • SQL*PLUSで列幅変更したい。

    こんにちわ。 いまORACLE9iを使用している者です。 SQL*PLUSで, つぎのようなSELECT文を発行しました。 「SELECT HOGEKBN AS ほげほげ区分 FROM HOGE_TABLE」 「HOGEKBN」は1桁のデータなので, 実行結果に列名である"ほげほげ区分"が表示されません。 これを表示したいと思い, 「 SELECT HOGEKBN AS ほげほげ区分 FROM HOGE_TABLE COLUMN ほげほげ区分 FORMAT A20 」 としたところ, COLUMN~の行で, "ORA-00933: SQLコマンドが正しく終了されていません。" というエラーメッセージが出てしまいます。 SQL*PLUSで列幅指定するにはどうすれば良いでしょうか? 教えてください。よろしくお願いします。