DataEase v2 SQL 习惯汇总


飞致云 发布于 2024-02-01 / 745 阅读 / 0 评论 /
v2.x 注意事项 v2.x 使用 Apache Calcite 连接数据源,编写 SQL 获取数据时,需要遵循 Calcite 语法; 以下是已知的语法调整,将持续更新。 IF 关键字 标准 SQL中使用了 IF 关键字: SELECT create_time, IF ( pay_

v2.x 注意事项

v2.x 使用 Apache Calcite 连接数据源,编写 SQL 获取数据时,需要遵循 Calcite 语法;

以下是已知的语法调整,将持续更新。

IF 关键字

标准 SQL中使用了 IF 关键字:

SELECT
    create_time,
    IF ( pay_method = '支付宝', '线上支付', '线下支付' ) 渠道,
    pay_method
FROM
    transactions
ORDER BY
    create_time DESC
    LIMIT 3
 
---
create_time             渠道         pay_method
2024-06-02 11:11:11     线上支付        支付宝
2024-05-02 11:11:11     线下支付        云闪付
2024-04-02 11:11:11     线下支付        微信

Calcite 不支持此关键字,v2.x 调整写法,使用 CASE WHEN 来代替:

SELECT
    create_time,
    CASE pay_method WHEN '支付宝' THEN '线上支付' ELSE '线下支付' END 渠道,
    pay_method
FROM
    transactions
ORDER BY
    create_time DESC
    LIMIT 3
 
---
create_time             渠道         pay_method
2024-06-02 11:11:11     线上支付        支付宝
2024-05-02 11:11:11     线下支付        云闪付
2024-04-02 11:11:11     线下支付        微信

13位时间戳转换

标准 SQL 直接使用 from_unixtime

SELECT
  create_time,
  from_unixtime( create_time / 1000 ) AS formatted_date
FROM
    dataset_table
 
---
create_time      formatted_date 
1709116580965   2024-02-28 10:36:20.9650
1664443534295   2022-09-29 09:25:34.2950
1664441241002   2022-09-29 08:47:21.0020

v2.x 调整写法,from_unixtime(CAST(`last_update_time` AS BIGINT), 'yyyy-MM-dd HH:mm:ss')

SELECT 
    create_time,
    from_unixtime( CAST( `create_time` AS BIGINT ), 'yyyy-MM-dd HH:mm:ss' ) AS formatted_date
FROM
    dataset_table
 
---
create_time      formatted_date 
1709116580965   2024-02-28 10:36:20
1664443534295   2022-09-29 09:25:34
1664441241002   2022-09-29 08:47:21

DATEDIFF 函数

标准 SQL 支持 datediff 函数,如下:

select
   datediff(endtime,begintime) as diffday
from yanz
 
---
begintime               endtime                 diffday
2024-02-27 10:55:26     2024-02-29 10:55:32     2
2024-02-01 10:55:43     2024-02-23 10:55:47     22

v2.x Calcite 不支持 datediff 函数,调整写法:

select
  begintime,
  endtime,
  FLOOR((UNIX_TIMESTAMP(`endtime`) - UNIX_TIMESTAMP(`begintime`)) / (1000*24 * 60 * 60)) AS `diffday`
from yanz
 
---
begintime               endtime                 diffday
2024-02-27 10:55:26     2024-02-29 10:55:32     2
2024-02-01 10:55:43     2024-02-23 10:55:47     22

DATE_FORMAT 函数

标准 SQL 支持 data_format 函数,如下:

SELECT
    create_time,
    date_format( create_time, '%Y-%m' ) as yearm
FROM
    transactions
    LIMIT 2
 
---
create_time            yearm
2023-04-19 16:17:00    2023-04
2023-04-19 17:17:00    2023-04

Calcite 不支持 date_format 函数,v2.x 版本增加需要在数据集中新建计算字段,示例如下:

DE_DATE_FORMAT(CURRENT_DATE,'yyyy-MM')

SUBSTR 函数

标准 SQL 支持 substr 函数,如下:

SELECT
    city,
    substr( city, 1, 2 ) AS cit
FROM
    transactions
    LIMIT 3;
 
---
city    cit
潍坊市 潍坊
淄博市 淄博
日照市 日照

v2.x 版本的 Calcite 不支持 substr 函数,可以使用标准 SQL 中的 SUBSTRING 函数,因为很多 SQL 方言都支持这个标准 SQL 函数:

SELECT
    province,
    city,
    SUBSTRING( city FROM 1 FOR 2 ) AS cit
FROM
    transactions
    LIMIT 3;
 
---
city    cit
潍坊市 潍坊
淄博市 淄博
日照市 日照



是否对你有帮助?