问题
给定的问题涉及“产品”表,构成如下:
列名 | 类型 |
---|---|
product_id | int |
low_fats | 枚举 |
可回收 | 枚举 |
在这里,product_id
是主要键。 low_fats
和recyclable
是枚举类型,既表示产品是低脂('y'还是n'),以及它是否分别是可回收的('y''还是n')。任务是找到低脂和可回收的产品的ID。
解释
例如,给定“产品”表:
product_id | low_fats | 可回收 |
---|---|---|
0 | y | n |
1 | y | y |
2 | n | y |
3 | y | y |
4 | n | n |
预期的输出应为:
product_id |
---|
1 |
3 |
输出列出了低脂产品(即low_fats = 'Y'
)和可回收的产品的product_id
值(即recyclable = 'Y'
)。
解决方案
我们将查看两个不同的SQL查询,并讨论它们的方法,性能和特征。
源代码1
第一个SQL查询使用直接的WHERE
子句过滤既低脂肪又可回收的产品:
SELECT product_id
FROM Products
WHERE low_fats = 'Y'
AND recyclable = 'Y'
此查询直接利用平等操作员来过滤所需的记录。它的运行时为929ms,超过了Leetcode上其他提交的51.43%。
源代码2
第二个SQL查询不同之处在于它在WHERE
子句中使用CASE
语句:
SELECT product_id
FROM Products
WHERE
CASE
WHEN low_fats = 'Y' AND recyclable = 'Y' THEN 1
ELSE 0
END = 1
在这种方法中,我们使用CASE
语句将条件封装在开关案例结构中。如果产品既低脂肪又可回收,则返回1;否则为0。WHERE
子句以1的回报值过滤了记录。其运行时为1316ms,超过了LeetCode提交的13.20%。
结论
这两个解决方案为相同问题提供了两种不同的方法:第一个解决方案在WHERE
子句中使用了简单的布尔逻辑,而第二个则在WHERE
子句中采用了更复杂的条件(CASE
)语句。
虽然第一种方法提供了一种更可读,更快的解决方案,但在处理更复杂的方案时,第二种方法可能会派上用场。但是,值得注意的是,CASE
语句引入了其他计算,这可能解释了运行时较慢。
在leetcode性能方面,解决方案排名如下:
- 源代码1
- 源代码2
尽管如此,现实世界中的RDBMS性能可能会根据索引,数据分布和数据库优化技术等因素而有所不同。
您可以在LeetCode中找到原始问题。
有关更有见地的解决方案和与技术相关的内容,请随时在Beacons page上与我联系。