Where 子句以类型是否存在为条件

Where clause conditional on if a type exists

考虑以下查询:

SELECT p.*
FROM product p
LEFT JOIN product_time pt ON p.id = pt.product_id
WHERE pt.time BETWEEN ? AND ? 
AND pt.type = 'PRODUCTION_DATE';

我需要更改我的查询,以便它首先按“RELEASE_DATE”进行过滤。如果类型为“RELEASE_DATE”的 production_time 不存在,则按“PRODUCTION_DATE”过滤。我该怎么做?

您似乎想在检查实际值之前确保发布日期存在或不存在并且生产日期存在。为此,您为每种类型左加入:

SELECT product.*
FROM product
LEFT JOIN product_time AS rel_time ON product.id = rel_time.product_id AND rel_time.type = 'RELEASE_DATE'
LEFT JOIN product_time AS prd_time ON product.id = prd_time.product_id AND prd_time.type = 'PRODUCTION_DATE'
WHERE rel_time.pk IS NOT NULL AND rel_time.time BETWEEN ? AND ?
OR    rel_time.pk IS     NULL AND prd_time.time BETWEEN ? AND ?

使用LEFT JOIN两次如下:

SELECT p.*
FROM product p
LEFT JOIN product_time pt1 ON p.id = pt1.product_id
    AND pt1.time BETWEEN ? AND ? 
    AND pt1.type = 'RELEASE_DATE'
LEFT JOIN product_time pt ON p.id = pt.product_id
    AND pt.time BETWEEN ? AND ? 
    AND pt.type = 'PRODUCTION_DATE'
WHERE ISNULL(pt1.time, pt.time) IS NOT NULL