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
如果 id
为 null
,则不会生成任何条件,生成的 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}
-
IFNULL(ORDER_NO, 0)
:-
这个函数确保
ORDER_NO
如果为NULL
,则用0
替代。这样可以避免MAX
函数在处理NULL
值时的问题。
-
-
MAX(...)
:-
这个函数用于获取
ORDER_NO
的最大值。如果所有ORDER_NO
都是NULL
,MAX
函数会返回NULL
。
-
-
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
详细解释
-
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_YEAR
和r.REPORT_NAME
拼接成一个字符串,中间用年
连接。
-
-
嵌套
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>
详细解释
-
bColumnName
:-
bColumnName
是一个动态列名,它可能是通过某种逻辑动态生成的,或者从用户输入中获取的。 -
使用
${}
语法直接将bColumnName
的值插入到 SQL 中。这允许你在运行时动态指定列名。 -
例如,
bColumnName
可能是ec_lc.NAME
或ec_lc.ID
等,具体取决于业务需求。
-
table_a
Column Name | Data Type |
---|---|
id | INT |
name | VARCHAR |
created_at | DATETIME |
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