当前位置: 首页 > article >正文

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;


http://www.kler.cn/a/597257.html

相关文章:

  • 【2025】基于python+flask的在线考试系统(源码、万字文档、图文修改、调试答疑)
  • CI/CD(三) 安装nfs并指定k8s默认storageClass
  • vue项目使用k8s动态配置环境变量(运行时)
  • 初识TensorFlow:从入门到简单应用
  • 如何区别在Spring Boot 2 和 Spring Boot 3 中使用 Knife4j:集成与配置指南
  • Dart语言的安全开发
  • 为容器指定固定IP地址
  • 2024 浅浅总结
  • golang 生成单元测试报告
  • 我的ffmpeg爬坑之路(3)
  • SPI 机制与 Spring Boot AutoConfiguration 对比解析
  • Flink实战教程从入门到精通(基础篇)(一)Flink简介
  • web客户端存储,IndexDB相关讲解
  • NLP高频面试题(七)——GPT和Bert的mask有什么区别?
  • React 中 Context 的作用是什么,在什么场景下使用它?
  • 2025蓝桥杯JAVA编程题练习Day7
  • Kafka集成Debezium监听postgresql变更
  • 5、Pytorch 实现简单图卷积GCN,数据集Cora分类任务
  • 基于AOP注解+Redisson实现Cache-Aside缓存模式实战
  • 【八股文】http怎么建立连接的