雪花中 SQL CASE 语句中的 CONCAT

时间:2021-03-10 18:00:21

标签: sql concatenation case snowflake-cloud-data-platform string-length

我正在尝试将 REVENUE_MONTH 列中的数据转换为 03 而不是 3。我还将将该新列与现有的 REVENUE_MONTH 和 REVENUE_YEAR 列连接起来,以获得类似 2020-03-01 而不是 2020 的数据-3-01。以下是我的两种方法,

  1. 使用 IN
CONCAT(REVENUE_YEAR,'-',CAST(CASE WHEN REVENUE_MONTH IN (1,2,3,4,5,6,7,8,9) THEN CONCAT(0,REVENUE_MONTH) ELSE REVENUE_MONTH END AS NUMBER(38,0)),'-','01')
  1. 使用长度()
CONCAT(REVENUE_YEAR,'-',CAST(CASE WHEN LENGTH(REVENUE_MONTH)=1 THEN CONCAT(0,REVENUE_MONTH) ELSE REVENUE_MONTH END AS NUMBER(38,0)),'-','01')

不幸的是,他们都返回 2020-3-01 而不是预期的 2020-03-01

2 个答案:

答案 0 :(得分:2)

您尝试过 LPAD 吗?下面应该工作

CONCAT(REVENUE_YEAR,'-', LPAD(REVENUE_MONTH,2,'0'),'-','01')

答案 1 :(得分:1)

SELECT column1, RIGHT('0' || CAST(column1 AS varchar(2)), 2) as month
FROM VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)
ORDER BY 1;   

给出:

COLUMN1 MONTH
1   01
2   02
3   03
4   04
5   05
6   06
7   07
8   08
9   09
10  10
11  11
12  12

但也可以:

SELECT column1, RIGHT('0' || column1::text, 2) as month
FROM VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)
ORDER BY 1;   

但你真正想要的是LPAD

SELECT column1, LPAD( column1, 2, '0') as month
FROM VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)
ORDER BY 1;