【发布时间】:2021-06-14 03:09:14
【问题描述】:
我正在重构一些 SQL 以删除存在于多个 OR 条件中的硬编码日期,作为 INSERT INTO 语句的一部分。
例如:
OR ( site = 'site.com' AND url = 'www.someurl.com' AND date < '2021-01-01')
OR ( site = 'site.com' AND url = 'www.otherurl.com' AND date < '2019-09-09')
site = 'site.com' 始终保持不变。
url = 'www.someurl.com' 会有不同的网址
日期也会改变。
为了删除像上面那样存在的几行,我创建了一个参考表,其中包含一个站点名称列表、一个用于标记有趣 url 的布尔列和日期(与硬编码的相同) )
除了 AND 日期
我遇到了一个子查询兔子洞,内容如下:
OR (site = 'site.com' AND url IN ( SELECT url_ref
FROM REF_TABLE
LEFT JOIN TABLE A
ON url = url_ref) AND date < ( SELECT start_date
FROM REF_TABLE
LEFT JOIN TABLE A
ON url = url_ref ) )
我能够消除另一个包含 url 列表但没有日期的大型 OR 语句。我被困在这几种情况下,我只需要获取日期小于某个日期的行,如参考表中所定义。
这样工作:
OR (ref.intersting = 't' AND url NOT IN ( SELECT url_ref
FROM REF_TABLE
WHERE url_ref IS NOT NULL ) )
谢谢!
附言这样做的目的是让我可以在每次创建新异常时停止编辑 python 脚本。相反,我只需在引用表中添加一行,脚本不需要更改。
【问题讨论】:
标签: sql postgresql subquery conditional-statements