为 PostgresSQL 重写 Select SQL 查询
Rewrite Select SQL query for PostgreSQL
我根据这个主题在 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
结果
ERROR: syntax error at or near "value"
LINE 8: end value
我如何为 PostgreSQL 重写此 SQL 查询?
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
The AS keyword is optional, but only if the new column name does not match any PostgreSQL keyword (see Appendix C). To avoid an accidental match to a keyword, you can double-quote the column name. For example, VALUE is a keyword, so this does not work:
SELECT a value, b + c AS sum FROM ...
but this does:
SELECT a "value", b + c AS sum FROM ...
For protection against possible future keyword additions, it is recommended that you always either write AS or double-quote the output column name.
无关,但是:
您不应在 text
列中存储布尔值(true
、false
)。为此,Postgres 有一个原生的 boolean
数据类型。
我根据这个主题在 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
结果
ERROR: syntax error at or near "value"
LINE 8: end value
我如何为 PostgreSQL 重写此 SQL 查询?
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
The AS keyword is optional, but only if the new column name does not match any PostgreSQL keyword (see Appendix C). To avoid an accidental match to a keyword, you can double-quote the column name. For example, VALUE is a keyword, so this does not work:
SELECT a value, b + c AS sum FROM ...
but this does:
SELECT a "value", b + c AS sum FROM ...
For protection against possible future keyword additions, it is recommended that you always either write AS or double-quote the output column name.
无关,但是:
您不应在 text
列中存储布尔值(true
、false
)。为此,Postgres 有一个原生的 boolean
数据类型。