case语句

iecba09b  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(351)

我有以下测试用例,运行良好:

WITH t1 AS (
  SELECT 1 as id
  UNION ALL
  SELECT NULL
  UNION ALL
  SELECT 2
)

Select 
  *,
  case when id is null then "null" when id = 1 then "test" end
from 
  t1

在我的实际查询中,我有一个日期差异函数:

DATE_DIFF(second_date,first_date, DAY) as time_lag,

在尝试应用以下case语句时:

case when time_lag is null then "null" when time_lag = "1" then "test" end

我有一个错误:

No matching signature for operator = for argument types: STRUCT<client_ID STRING, Total INT64, first_date DATE, ...>, STRING. Supported signatures: ANY = ANY at [79:49]

据我所知,diff语句返回的日期 INT64 以及一些空值,因为并非所有行都包含日期。我不明白我的测试用例和我的真实用例有什么不同。我真正的用例有什么问题。。。

cu6pst1q

cu6pst1q1#

你应该试试

case when time_lag is null then "null" when time_lag = 1 then "test" end

正如你所说,时间差是int64,所以问题出在 ... when time_lag = "1" then ...

ubof19bj

ubof19bj2#

关于我的评论,您将时间延迟视为数据库表中的一列,我猜,它不是。它是从两列中计算出来的值。因此,您有两个选择-要么使用执行date\u diff操作的子查询,然后将其别名为time\u lag。或者在case表达式中直接使用计算。

CASE WHEN DATE_DIFF(second_date,first_date, DAY) is null THEN null WHEN DATE_DIFF(second_date,first_date, DAY) = 1 then 'Test' end

相关问题