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

sql难点

一、

假设你有一个查询,需要根据 id 是否为 null 来动态生成 SQL 条件:

xml复制

<select id="getResources" resultType="Resource">
    SELECT * FROM resources
    <where>
        <if test="id != null">
            and id <![CDATA[<>]]> #{id}
        </if>
    </where>
</select>

生成的 SQL

假设 id 的值为 123,生成的 SQL 将是:

sql复制

SELECT * FROM resources
WHERE id <> 123

如果 idnull,则不会生成任何条件,生成的 SQL 将是:

sql复制

SELECT * FROM resources

从表 resources 中选择所有列(* 表示所有列),但只选择那些 id 字段不等于 123 的记录。

二、

查询解释

sql复制

SELECT
    IFNULL(MAX(IFNULL(ORDER_NO, 0)), 0)
FROM
    scm_web_classify_tab
WHERE
    DELETE_FLAG = 0
    AND TENANT_ID = #{tenantId}
  1. IFNULL(ORDER_NO, 0)

    • 这个函数确保 ORDER_NO 如果为 NULL,则用 0 替代。这样可以避免 MAX 函数在处理 NULL 值时的问题。

  2. MAX(...)

    • 这个函数用于获取 ORDER_NO 的最大值。如果所有 ORDER_NO 都是 NULLMAX 函数会返回 NULL

  3. IFNULL(..., 0)

    • 这个函数确保如果 MAX 函数的结果是 NULL,则用 0 替代。这样可以确保最终结果总是返回一个数字,而不是 NULL

三、

SQL 片段解释

sql复制

CASE
    WHEN r.REPORT_TYPE = 3 THEN CONCAT(cci.REPORT_CYCLE_YEAR, '年', r.REPORT_NAME)
    WHEN r.REPORT_TYPE = 2 THEN CONCAT(cci.REPORT_CYCLE_YEAR, '年',
        CASE
            WHEN cci.REPORT_CYCLE_QUARTER = 1 THEN '第一季度'
            WHEN cci.REPORT_CYCLE_QUARTER = 2 THEN '第二季度'
            WHEN cci.REPORT_CYCLE_QUARTER = 3 THEN '第三季度'
            WHEN cci.REPORT_CYCLE_QUARTER = 4 THEN '第四季度'
        END
    )
    -- 可以继续添加其他条件
END

详细解释

  1. CASE WHEN

    • CASE 语句用于根据条件选择不同的值。

    • WHEN r.REPORT_TYPE = 3:如果 r.REPORT_TYPE 的值为 3,则执行 THEN 后面的表达式。

    • THEN CONCAT(cci.REPORT_CYCLE_YEAR, '年', r.REPORT_NAME):将 cci.REPORT_CYCLE_YEARr.REPORT_NAME 拼接成一个字符串,中间用 连接。

  2. 嵌套 CASE WHEN

    • WHEN r.REPORT_TYPE = 2 的情况下,进一步使用嵌套的 CASE 语句来处理季度的情况。

    • WHEN cci.REPORT_CYCLE_QUARTER = 1 THEN '第一季度':如果 cci.REPORT_CYCLE_QUARTER 的值为 1,则返回字符串 第一季度

    • 同样地,处理其他季度的情况。

四、

示例代码

xml复制

<if test="tableName=='zb_logistics_enterprises_manage' or tableName=='zb_logistics_park_base_run_monitor' or tableName=='zb_report_cold_chain_logistics_enterprises_info'">
    ${bColumnName},
    ec_lc.STATE lastCycleState,
</if>

详细解释

  1. bColumnName

    • bColumnName 是一个动态列名,它可能是通过某种逻辑动态生成的,或者从用户输入中获取的。

    • 使用 ${} 语法直接将 bColumnName 的值插入到 SQL 中。这允许你在运行时动态指定列名。

    • 例如,bColumnName 可能是 ec_lc.NAMEec_lc.ID 等,具体取决于业务需求。

table_a
Column NameData Type
idINT
nameVARCHAR
created_atDATETIME
 System.out.println("aColumnName: " + paramMap.get("aColumnName"));
        System.out.println("bColumnName: " + paramMap.get("bColumnName"));

假设 table_a 的列名是 id, name, created_at,则输出可能是:

aColumnName: a.id,a.name,a.created_at
bColumnName: b.id1,b.name1,b.created_at1

相关文章:

  • 什么手机卡最便宜 怎么办手机卡最便宜
  • 【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA
  • AI驱动的广告制作革命:Icon如何实现从创意到成片的全流程自动化
  • OpenCV2D 特征框架 (22)人脸检测的一个类cv::FaceDetectorYN的使用
  • Sentinel——Spring Boot 应用接入 Sentinel 后内存开销增长计算方式
  • 1.攻防世界 unserialize3(wakeup()魔术方法、反序列化工作原理)
  • rocketmq-netty通信设计-request和response
  • APP端网络测试与弱网模拟!
  • ASP.NET Core用MediatR实现领域事件
  • 【蓝桥】线性DP--最快洗车时间
  • opencascade 标注-直线标注、半径标准、角度标注
  • STM32+Proteus+DS18B20数码管仿真实验
  • 23页PDF | 国标《GB/T 44109-2024 信息技术 大数据 数据治理实施指南 》发布
  • QML使用ChartView绘制饼状图
  • python-leetcode 23.反转链表
  • 【ubuntu24.04】 强制重启导致大模型的磁盘挂载出错
  • RockyLinux AlmaLinux RedHat 8,9安装图形化
  • Golang的多团队协作编程模式与实践经验
  • 大模型笔记:pytorch实现MOE
  • 华硕笔记本怎么一键恢复出厂系统_华硕笔记本一键恢复出厂系统教程
  • 做网站和推广需要多少钱/网站一年了百度不收录
  • 做网站界面用什么软件/百度在线翻译
  • 滕州外贸网站建设/seo关键词排名优化价格
  • 购物网站页面设计/新网站快速收录
  • 昆明高端网站建设公司/百度高级搜索页面的网址
  • 建网站需要什么步骤/河南关键词优化搜索