如果 RedShift 中的字段类型是整数,我如何输入 varchar 值?

How can i enter varchar values in case if the field type is integer in RedShift?

我正在尝试 运行 这个查询:

select count(uid),
case when duration=0 then '0'
     when duration between 0 and 10 then '1-10 sec' end as Duration
from mr_session_log
where event_id=10     
group by
case when duration=0 then '0'
     when duration between 0 and 10 then '1-10 sec' end 

但是由于 duration 是整数,Redshift 不允许我在 then 之后输入“1-10 秒”值。

有没有办法输入与原始列值不同的值?

您在列中混合类型的问题。

  • when duration=0 then 0 returns 一个 整数
  • when duration between 0 and 10 then '1-10 sec' returns一个字符串
  • 它们都填充相同的 Duration 输出列(与原始 duration 列不同)

我建议您将第一个结果更改为 string,例如:when duration=0 then '0 sec'

SQL 是一种 强类型 语言。 但我认为我们需要更精确地处理此处的数据类型。我建议:

SELECT 计数(uid)AS ct
     , CASE WHEN duration = 0 THEN <b>text '0 sec'</b> -- 字符串文字的显式类型
            WHEN duration BETWEEN 1 AND 10 THEN '1-10 sec' -- 强制转换为相同类型
       结束持续时间
来自 mr_session_log
其中 event_id = 10
按 2 分组;

您也可以使用 '0 sec'::textcast('0 sec' AS text)

在现代 Postgres '0 sec' 甚至没有显式类型的 '0' 中也是如此,因为 字符串文字 在大多数情况下默认为类型 text上下文。

可以 甚至使用 0::textcast(0 AS text),但是提供一个字符串作为 数字文字 是没有意义的] 并使 Postgres 转换 两次 (在这种情况下,首先数字文字自动转换为 int,然后 int 转换为 text)。

阅读chapter about constants in the Postgres manual。 (我不知道 Redshift 有适当的文档。)

GROUP BY 2 只是引用第二个 SELECT 项的语法 shorthand。如果这不应该在 Redshift 中实现,请像以前一样重复 CASE 表达式。