如何在 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】:

您可以将IFIFNULL 一起使用

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 中获取看起来像 JSON dict 的值?

SQL Server 2008 - SELECT 子句中的 Case / If 语句 [重复]

如何从 SQL Server 中的值列表中进行选择

如何在 javascript 中的 if/else 中添加“和”

如何在 React Native 上进行选择?

SQL 从 case 或 IF 中选择...然后逻辑?