You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:15:59