含FreeMarker <#if>标签的SQL查询作用及自定义排序实现咨询
问题解答
1. 该SQL查询的用途及数据展示方式
这个SQL用于从emptable表中提取员工姓名,将emp_name字段分别别名为ID和label(这类别名通常适配前端下拉选择、自动补全等需要id-label结构的场景),同时支持根据传入的query参数做前缀模糊搜索,最终按id排序返回结果。
按需展示数据的逻辑:
- 若未传入
query参数,或query是空白字符串,WHERE子句等价于1=1,会返回表内所有员工数据; - 若传入有效的
query参数,会自动追加模糊匹配条件,仅返回姓名(转大写后)以query(转大写后)开头的员工数据。
2. <#if>标签的作用
这是FreeMarker模板引擎的条件判断标签,核心作用是动态生成合法的SQL语句:
- 仅当
query参数存在(query??表示参数不为null),且去除首尾空格后不为空字符串时,才会把AND (UPPER(empname) LIKE UPPER('${query}%'))这行过滤条件追加到WHERE子句中; - 若不满足条件,这行逻辑不会出现在最终执行的SQL里,避免出现多余的
AND关键字导致SQL语法错误。
3. 实现MARK_22排第一、MARK排第二的排序方式
可以通过ORDER BY结合CASE WHEN自定义排序优先级,把指定姓名前置,其余数据按常规规则排序:
SELECT emp_name AS ID, emp_name as label FROM emptable WHERE 1=1 <#if query?? && query?trim!=""> AND (UPPER(empname) LIKE UPPER('${query}%')) </#if> ORDER BY CASE WHEN UPPER(emp_name) = 'MARK_22' THEN 1 WHEN UPPER(emp_name) = 'MARK' THEN 2 ELSE 3 END, emp_name; -- 优先级相同的记录,按姓名排序,可按需替换为id等字段
说明:
- 用
CASE WHEN给MARK_22分配排序优先级1,MARK分配优先级2,其他数据优先级3,数值越小排序越靠前; - 后面的
emp_name是优先级相同时的二次排序规则,比如多条MARK_22记录会按姓名本身排序,可根据需求调整为其他字段。
内容的提问来源于stack exchange,提问作者Yes_par_row
相关产品推荐
相关产品推荐

