首页 文章

重写为PostgreSQL选择SQL查询

提问于
浏览
0

我基于这个主题在PostgreSQL中创建了这些表:

Database design for user settings

-- TABLE SETTING

CREATE TABLE SETTING(
 ID INTEGER NOT NULL,
 DESCRIPTION TEXT,
 CONSTRAINED TEXT,
 DATA_TYPE TEXT,
 MIN_VALUE TEXT,
 MAX_VALUE TEXT
)
;

-- ADD KEYS FOR TABLE SETTING

ALTER TABLE SETTING ADD CONSTRAINT KEY34 PRIMARY KEY (ID)
;

-- TABLE ALLOWED_SETTING_VALUE

CREATE TABLE ALLOWED_SETTING_VALUE(
 ID INTEGER NOT NULL,
 SETTING_ID INTEGER,
 ITEM_VALUE TEXT,
 CAPTION TEXT
)
;

-- CREATE INDEXES FOR TABLE ALLOWED_SETTING_VALUE

CREATE INDEX IX_RELATIONSHIP16 ON ALLOWED_SETTING_VALUE (SETTING_ID)
;

-- ADD KEYS FOR TABLE ALLOWED_SETTING_VALUE

ALTER TABLE ALLOWED_SETTING_VALUE ADD CONSTRAINT KEY35 PRIMARY KEY (ID)
;

-- TABLE USER_SETTING

CREATE TABLE USER_SETTING(
 ID INTEGER NOT NULL,
 USER_ID INTEGER,
 SETTING_ID INTEGER,
 ALLOWED_SETTING_VALUE_ID INTEGER,
 UNCONSTRAINED_VALUE TEXT
)
;

-- CREATE INDEXES FOR TABLE USER_SETTING

CREATE INDEX IX_RELATIONSHIP15 ON USER_SETTING (SETTING_ID)
;

CREATE INDEX IX_RELATIONSHIP17 ON USER_SETTING (ALLOWED_SETTING_VALUE_ID)
;

-- ADD KEYS FOR TABLE USER_SETTING

ALTER TABLE USER_SETTING ADD CONSTRAINT KEY36 PRIMARY KEY (ID)
;

但是当我运行Select SQL查询时,我得到错误,因为它是针对MySQL的:

-- Show settings for a given user
select
  US.user_id 
, S1.description 
, S1.data_type 
, case when S1.constrained = 'true'
  then AV.item_value
  else US.unconstrained_value
  end value
, AV.caption
from USER_SETTING US
  inner join SETTING S1
    on US.setting_id = S1.id 
  left outer join ALLOWED_SETTING_VALUE AV
    on US.allowed_setting_value_id = AV.id
where US.user_id = 234

result

ERROR:  syntax error at or near "value"
LINE 8:   end value

那么我可以为PostgreSQL重写这个SQL查询吗?

1 回答

  • 1

    value 是保留关键字,需要在SQL中引用它:

    case when S1.constrained = 'true'
        then AV.item_value
        else US.unconstrained_value
    end "value"
    

    添加 as 关键字有效,因为这样可以消除 value 可能存在的歧义 . 但引用它仍然更好 - 即使使用 as 关键字(或找到不同的名称) .

    This behaviour is documented并且手动明确提到了关键字 value

    AS关键字是可选的,但仅当新列名与任何PostgreSQL关键字不匹配时(参见附录C) . 为避免意外匹配关键字,您可以双引号列名称 . 例如,VALUE是一个关键字,所以这不起作用:选择一个值,bc AS sum FROM ...但是这样做:选择一个“值”,bc AS sum FROM ...为防止将来可能添加关键字,建议您始终写入AS或双引号输出列名称 .


    不相关,但是:

    不应在 text 列中存储布尔值( truefalse ) . Postgres有一个本机 boolean 数据类型 .

相关问题