我有一个有效的PostgreSQL查询,列"代码"在表和表test.a有常见的日期列,我想限制搜索结果的年份,日期格式是(2010-08-25)
SELECT *
FROM test.a
WHERE form IN ('xyz')
AND code IN (
SELECT code
FROM test.city)
感谢任何帮助
答案 0 :(得分:1)
如果通过"限制"你的意思是"过滤",然后我可以给你一个选项
SELECT
*
FROM
test_a
WHERE
form IN ('xyz')
AND code IN (
SELECT code
FROM test_city
)
AND EXTRACT(YEAR FROM dateColumn) = 2010;
db-fiddle让你运行并玩它:https://www.db-fiddle.com/f/5ELU6xinJrXiQJ6u6VH5/6
答案 1 :(得分:1)
要在2010年返回date_col
个值的行:
SELECT *
FROM test.a
WHERE form = 'xyz'
AND EXISTS (
SELECT 1
FROM test.city
WHERE code = a.code
)
AND date_col >= '2010-01-01'
AND date_col < '2011-01-01';
这样,查询可以使用date_col
上的索引(或者,对于此特定查询,最好在(form, date_col)
或(form, code, date_col)
上使用索引)。过滤器可以正常用于数据类型date
和timestamp
(您没有透露数据类型,&#34;日期格式&#34;无关紧要)。
如果表现有任何问题,请不要使用 之类的表达式。虽然这对人眼来说看起来干净简单,但却会破坏关系数据库中的性能。在测试过滤器之前,必须对表的每个行评估左侧表达式。而且,不能使用简单的索引。 (只有EXTRACT(YEAR FROM dateColumn) = 2010
(EXTRACT(YEAR FROM dateColumn))
上的表达式索引符合条件。)对于小表来说并不重要,对大表来说至关重要。
EXISTS
可能比IN
更快,除了查询计划最终相同的简单情况。如果涉及NULL值,则相反的NOT IN
可以是陷阱: