【问题标题】:how to select value like an IF in SQL?如何在 SQL 中选择像 IF 这样的值?
【发布时间】: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。

标签: sql google-bigquery case


【解决方案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,尚不清楚是否支持。 stackoverflow.com/questions/57501001/…
      • 抱歉,我没有意识到这是个大问题。我不太熟悉它是否可以计算列,但正如您建议的那样,您可以在查询中使用 CASE WHEN intent_detail IS NULL THEN 1 ELSE 0 END as intent_detail_flag 来完成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多