如何为PostgreSQL重写SQL

mzaanser  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(121)

我正在尝试将两段SQL Server代码重写为PostgreSQL。
第一个是:

WHERE
    (DATEADD(S, Submit_Date, '1970-01-01')) >= DATEADD(d, -3, GETDATE())
    OR
    (DATEADD(S, Last_Changed_Date, '1970-01-01')) >= DATEADD(d, -3, GETDATE())

字符串
DATEADD之后,我一直收到一个关于S的错误。
第二个是这样的:

WHERE (dbo.Test.[Log] LIKE '%%Status: Closed%%')
GROUP BY dbo.PYR.ID_Number


我需要帮助提到的SQL Server代码行修改PostreSQL。
有什么建议他们应该怎么做吗?

  • 谢谢-谢谢
axr492tv

axr492tv1#

WHERE
('1970-01-01'::timestamp + interval '1 second' * submit_date)  >= now()+interval '-3 days'
OR
('1970-01-01'::timestamp + interval '1 second' * Last_Changed_date)  >= now()+interval '-3 days'

WHERE  (dbo.Test."Log" ILIKE '%%Status: Closed%%')
GROUP BY dbo.PYR.ID_Number

字符串

vxf3dgd4

vxf3dgd42#

如果submit_dateLast_Changed_date都有索引,那么下面的查询可能比最初的第一个查询执行得更好:

WHERE submit_date >= extract(epoch FROM now() - interval '3 days')
   OR Last_Changed_date >= now() - interval '3 days')

字符串
避免对WHERE子句中的列进行操作,以便条件为 sargableSearchARGumentABLE);即,如果顺序地阅读整个表,则数据库引擎能够在索引可用时扫描索引。
为了可读性,我选择使用- interval '3 days'而不是+ interval '-3 days'。减去一个音程而不是加上一个负音程对读者的认知负荷更小,特别是当-被埋在一个与+有一定距离的字符串中时。
第二个查询可以重写如下:

WHERE Test."Log" ILIKE '%%Status: Closed%%'
GROUP BY dbo.PYR.ID_Number


虽然dbo.Test."Log"也用作列引用,但最好只在FROM子句的表引用中包含模式,因为这样可以最大限度地减少在模式更改时必须对查询进行的更改数量。
如果这是一个频繁的查询条件,并且是一个大表,那么探索索引Test."Log"的选项。

相关问题