如何在 SQL 中选择像 IF 这样的值?
Posted
技术标签:
【中文标题】如何在 SQL 中选择像 IF 这样的值?【英文标题】:how to select value like an IF in SQL? 【发布时间】:2021-08-04 23:32:13 【问题描述】:我有一些可能有或没有字符串值的行数据,我想根据字符串是否存在来添加另一个具有 1 或 0 的列。这是大型分组/聚合查询的一部分,所以想知道如何最好地做到这一点?
基本上如果是python:
if row.get('intent_detail'):
row['intent_detail_flag'] = 1
else:
row['intent_detail_flag'] = 0
return row
我打算试试CASE
- 这是最好的方法吗?
CASE
WHEN (max(intent_detail) IS NOT NULL)
THEN 1 ELSE 0
END as intent_detail_flag,
【问题讨论】:
你的方法很好,但是你可以去掉case
,只返回一个布尔值。
是的,我想知道是否还有其他带有 IF 的方法。我想要整数,这样我以后可以做平均值等。
。 .布尔值也非常灵活。我会推荐case
而不是if
,因为case
更灵活,而且它是标准SQL。
【参考方案1】:
您可以将IF
与IFNULL
一起使用
IF(IFNULL(MAX(intent_detail),0)>0,1,0)
【讨论】:
【参考方案2】:在 BigQuery 中,您可以将 SAFE_CAST 与 CASE 语句结合使用。所以你可以像这样标记整数或数字:
#standardSQL
WITH `data` AS (SELECT '2' AS `val`
UNION ALL SELECT 'not a number'
UNION ALL SELECT '4.6')
SELECT `val`,
CASE WHEN SAFE_CAST(`val` AS INT64) IS NULL THEN 0 ELSE 1 END AS `is_int64`,
CASE WHEN SAFE_CAST(`val` AS NUMERIC) IS NULL THEN 0 ELSE 1 END AS `is_numeric`
FROM `data`;
如果值无法转换,SAFE_CAST 将返回 NULL,因此如果您正在运行大型分组查询,您实际上根本不需要标志的中间步骤:
#standardSQL
WITH `data` AS (SELECT '2' AS `val`
UNION ALL SELECT 'not a number'
UNION ALL SELECT '4.6')
SELECT AVG(SAFE_CAST(`val` AS NUMERIC))
FROM `data`;
.. 返回 3.3(不是 2.2),因为 AVG function 忽略 NULL 值。
【讨论】:
【参考方案3】:我建议使用这样的计算列;
CREATE TABLE dbo.MyTable
(
intent_detail varchar(100) NULL,
intent_detail_flag AS CASE WHEN intent_detail IS NULL THEN 1 ELSE 0 END PERSISTED
) ON [PRIMARY]
GO
使其持久化意味着如果您更新intent_details的值,它只需要重新计算字段。
【讨论】:
哦,很有趣。我正在使用 bigquery,尚不清楚是否支持。 ***.com/questions/57501001/… 抱歉,我没有意识到这是个大问题。我不太熟悉它是否可以计算列,但正如您建议的那样,您可以在查询中使用 CASE WHEN intent_detail IS NULL THEN 1 ELSE 0 END as intent_detail_flag 来完成。以上是关于如何在 SQL 中选择像 IF 这样的值?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 - SELECT 子句中的 Case / If 语句 [重复]