SQL宏-代替UDF

        最近学到新的骚操作,SQL宏

        SQL宏是一种类似于函数的结构,它允许用户定义一组SQL语句或逻辑,并通过一个名称来引用它。宏的主要作用是简化复杂的SQL查询,提高代码的可读性和可维护性。它可以在SQL查询中被多次调用,就像函数一样。

SQL宏的特点

  1. 可重用性:宏可以被多次调用,避免重复编写相同的SQL逻辑。

  2. 参数化:宏可以接受参数,使得宏的逻辑可以根据输入的参数动态调整。

  3. 简化复杂查询:宏可以将复杂的SQL逻辑封装起来,使得主查询更加简洁。

示例场景1

假设我们有一个订单表orders,包含以下字段:

  • order_id:订单ID

  • customer_id:客户ID

  • order_date:订单日期

  • amount:订单金额

我们希望创建一个宏,用于计算某个客户在特定日期范围内的订单总金额。

创建宏

创意一个SQL宏,命名为getCustomerTotalAmount,类似一个函数,输入是顾客IDcustomer_id, 开始日期start_date, 结束日期end_date。

按照这三个字段,从orders表中计算这个顾客在start_date-end_date这个时间段的订单总金额。

CREATE TEMPORARY MACRO getCustomerTotalAmount(customer_id INT, start_date DATE, end_date DATE) 
AS 
SELECT 
    SUM(amount) AS total_amount 
FROM 
    orders 
WHERE 
    customer_id = customer_id 
    AND order_date BETWEEN start_date AND end_date;
使用宏

假设我们想计算客户ID为12025-01-012025-01-31之间的订单总金额,可以这样调用宏

SELECT 
    getCustomerTotalAmount(1, '2025-01-01', '2025-01-31') AS total_amount;

        上面这个例子可能不太常用,一般不会在SQL宏中使用From,这样会多次扫描源表,一般使用SQL宏做一些口径加工,代替case when,使代码的可读性更高。

示例场景2

假设我们有一个销售数据表sales,包含以下字段:

  • sale_id:销售记录ID

  • product_id:产品ID

  • quantity:销售数量

  • price:单价

  • region:销售地区

我们希望根据销售地区的不同,对销售额进行分类标记:

  • 如果地区是"North",标记为1

  • 如果地区是"South",标记为2

  • 如果地区是"East",标记为3

  • 如果地区是"West",标记为4

  • 其他地区标记为0

创建宏

我们可以创建一个宏classifySalesRegion,用于封装CASE WHEN逻辑:

CREATE TEMPORARY MACRO classifySalesRegion(region STRING) 
AS 
CASE 
    WHEN region = 'North' THEN 1
    WHEN region = 'South' THEN 2
    WHEN region = 'East' THEN 3
    WHEN region = 'West' THEN 4
    ELSE 0
END;
使用宏
SELECT 
    sale_id, 
    product_id, 
    quantity, 
    price, 
    region, 
    classifySalesRegion(region) AS region_code
FROM 
    sales;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值