我有两个数据库表:
# \d table_1
Table "public.table_1"
Column | Type | Modifiers
------------+---------+-----------
id | integer |
value | integer |
date_one | date |
date_two | date |
date_three | date |
# \d table_2
Table "public.table_2"
Column | Type | Modifiers
------------+---------+-----------
id | integer |
table_1_id | integer |
selector | text |
table_2.selector
中的值可以是one
,two
或three
中的一个,用于选择table_1
中的一个日期列
我的第一个实现使用了CASE
:
SELECT value
FROM table_1
INNER JOIN table_2 ON table_2.table_1_id = table_1.id
WHERE CASE table_2.selector
WHEN 'one' THEN
table_1.date_one
WHEN 'two' THEN
table_1.date_two
WHEN 'three' THEN
table_1.date_three
ELSE
table_1.date_one
END BETWEEN ? AND ?
selector
的值是这样的,我可以将感兴趣的列标识为eval(date_#{table_2.selector})
,如果 PL / pgSQL允许将字符串评估为表达式。
我能找到的最接近的是EXECUTE string
,它评估整个陈述。有没有办法评估表达式?
答案 0 :(得分:0)
在plpgsql函数中,您可以动态创建任何表达式。但是,在您描述的情况下,这不适用。必须在执行查询之前显式定义查询,而在执行查询时会选择字段。
您的查询是最好的方法。您可以尝试使用某个功能,但它不会带来任何好处,因为问题的本质将保持不变。