在BigQuery中,WHERE子句用于筛选查询结果,只返回满足指定条件的行。当需要根据当前行的值进行筛选时,可以使用以下几种方法:
SELECT *
FROM my_table
WHERE column1 > 100 AND column2 = 'active'
应用场景:简单的条件筛选,如状态检查、数值范围过滤等。
SELECT *
FROM orders o
WHERE o.order_date > (
SELECT MAX(return_date)
FROM returns r
WHERE r.order_id = o.order_id
)
应用场景:需要基于关联表中的数据进行筛选。
WITH ranked_data AS (
SELECT
*,
ROW_NUMBER() OVER(PARTITION BY customer_id ORDER BY order_date DESC) as rn
FROM orders
)
SELECT *
FROM ranked_data
WHERE rn = 1
应用场景:获取每个分组的最后一条记录或进行其他基于分组的筛选。
SELECT o.*
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.status = 'premium'
应用场景:基于关联表的条件筛选。
原因:当在WHERE子句中使用复杂子查询时,可能导致性能下降。
解决方案:
-- 优化前
SELECT * FROM table1 WHERE column1 IN (SELECT column2 FROM table2)
-- 优化后
SELECT t1.*
FROM table1 t1
JOIN table2 t2 ON t1.column1 = t2.column2
原因:在WHERE子句中引用了正在计算的列。
解决方案:
-- 错误示例
SELECT *, column1 * 2 AS doubled
FROM my_table
WHERE doubled > 100
-- 正确示例
WITH temp AS (
SELECT *, column1 * 2 AS doubled
FROM my_table
)
SELECT * FROM temp WHERE doubled > 100
原因:NULL值的特殊行为可能导致意外结果。
解决方案:
-- 可能不会返回预期结果
SELECT * FROM table WHERE column <> 'value'
-- 正确处理NULL
SELECT * FROM table WHERE column IS NULL OR column <> 'value'
SELECT *
FROM products
WHERE
(CASE
WHEN category = 'electronics' THEN price > 1000
WHEN category = 'clothing' THEN price < 100
ELSE TRUE
END)
SELECT *
FROM users u
WHERE EXISTS (
SELECT 1
FROM UNNEST(u.tags) AS tag
WHERE tag = 'premium'
)
BigQuery的WHERE子句功能强大,支持多种基于行内值的筛选方式,合理使用可以显著提高查询效率和灵活性。
没有搜到相关的文章