之前都是使用Oracle工作的,最近开始必须使用ClickHouse,用得时候发现他们的语句并不是完全一致的,这里简单记录一下。
获取某个时间值的年度和月度:
Oracle:使用EXTRACT()函数;
ClickHouse:使用toYear()、toMonth()函数;
----Oracle的实现方式:
SELECT EXTRACT(YEAR FROM A_DATE) AS 年度,
EXTRACT(MONTH FROM A_DATE) AS 月度
FROM TEMP;
----ClickHouse的实现方式:
SELECT toYear(A_DATE) AS "年度",
toMonth(A_DATE) AS "月度"
FROM TEMP;
group by的时候使用cube或者rollup:
----Oracle的实现方式:
SELECT 年度,月度,COUNT(1) AS CNT
FROM TEMP
GROUP BY 年度,CUBE(月度);
SELECT 年度,月度,COUNT(1) AS CNT
FROM TEMP
GROUP BY 年度,ROLLUP(月度);
SELECT 年度,月度,COUNT(1) AS CNT
FROM TEMP
GROUP BY ROLLUP(年度),月度;
----ClickHouse的实现方式:
SELECT "年度","月度",COUNT(1) AS CNT
FROM TEMP
GROUP BY "年度","月度" WITH CUBE;
SELECT "年度","月度",COUNT(1) AS CNT
FROM TEMP
GROUP BY "年度","月度" WITH ROLLUP;
------注意,不能写成[ GROUP BY "年度" WITH ROLLUP,"月度" ]会报错
填补空值:
Oracle:使用NVL()函数;
ClickHouse:使用ifNull()函数,注意此函数字母的大小写;
----Oracle的实现方式:
SELECT T.*,NVL(支出金额,0) FROM TAB T; ------如果“支出金额”字段的某个值是空值,返回0;
----ClickHouse的实现方式:
SELECT T.*,ifNull("支出金额",0) FROM TAB T; ------如果“支出金额”字段的某个值是空值,返回0;