2016-05-14 56 views
0

我创建了PostgreSQL的这些表基于这个话题:重写选择SQL查询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) 
; 

但是当我运行选择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 

结果

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

Howe我可以重写这个SQL查询PostgreSQL?

+0

这是有效的标准SQL,尝试添加'AS':'AS值'(我刚刚在小提琴上试过,这工作)。似乎是一个奇怪的解析错误。 – dnoeth

+0

是的,这解决了这个问题。谢谢! –

回答

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)。为避免与关键字意外匹配,您可以对列名称进行双重引号。例如,值是一个关键字,所以这不起作用:

SELECT a value, b + c AS sum FROM ...

但确实:

选择一个 “值”,B + C AS和FROM ...

为了防止未来可能的关键字添加,建议您始终写入AS或双引号输出列名称。


无关,而是:

你不应该布尔值(truefalse)存储在text列。 Postgres的数据类型为本地boolean