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

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;

相关文章:

  • JSONPath 的介绍
  • 搭建主从DNS、nfs、nginx
  • 【MySQL】undo日志页结构
  • 智能遥感新质生产力暨DeepSeek、Python、OpenCV驱动的空天地数据识别与计算及15个行业标杆案例
  • linux 之 查看进程运行时长
  • C# SerialPort 使用详解
  • Linux中修改文件的权限用什么命令?
  • 前端项目完结--上线打包发布步骤和方法
  • MySQL 中,查看执行频次、慢查询日志、SHOW PROFILE和 EXPLAIN性能分析和优化
  • 可视化图解算法:删除链表中倒数第n个节点
  • 在 Linux 系统中,路径(Path)用于定位文件或目录的位置。路径分为两种类型:相对路径和绝对路径。它们的核心区别在于路径的起点不同
  • 枚举的定义及其使用
  • 《齿轮咬合水分子:Relax Max如何用潜艇科技重构卫浴动力系统》​
  • 科技赋能安全:慧通测控的安全带全静态性能测试
  • STM32学习笔记之常用总线(原理篇)
  • 分布式节点池:群联云防护抗DDoS的核心武器
  • 大摩闭门会:250321 学习总结报告
  • 从实践到创新:低代码驱动教育行业数字化转型
  • 田间机器人幼苗视觉检测与护苗施肥装置研究(大纲)
  • 【Vitis AIE】FPGA图像处理 11 双线性插值 Bilinear Interpolation
  • 白天气温超30℃的北京,晚间下起了冰雹
  • 广东省人大教科文卫委原主任委员梁万里被开除党籍:退休后受贿仍不知止
  • 体坛联播|安切洛蒂执掌巴西男足,字母哥尝试离开雄鹿
  • 科普|“小”耳洞也会引发“大”疙瘩,如何治疗和预防?
  • 泽连斯基:乌克兰已做好与俄罗斯举行会谈的准备
  • 要更加冷静地看待“东升西降”的判断