## ⚠️ 前置注意事项
> PostgreSQL、OpenGauss 数据库默认会将 **未加引号的别名自动转为小写**
### 📄 示例说明
```sql
SELECT G_H.id, G_H.group_id, G_H.hospital_id, H_A.name AS hospitalName
FROM spd_base_auth_group_hospital AS G_H
JOIN spd_hospital_area AS H_A ON G_H.hospital_id = H_A.id
WHERE G_H.delete_time IS NULL AND ${where}
ORDER BY G_H.create_time ASC
```
如上诉SQL中的 `hospitalName`, 执行后拿到的字段为`hospitalname` 此时返回给前端的字段也为`hospitalname` `但`这里入参就变为了`hospitalname`,如果有`hospitalname`的值,程序是会查找并替换原始SQL中的`hospitalname`而不是`hospitalName`,就会导致找不到字段从而报错
解决方案有两种:
1. 强制使用小写,如 as `hospital_name` 或 `hospitalname`
2. 如果一定要大写,必须在`hospitalName`上加上`""`号,即`"hospitalName"`,这样数据库执行后才会原样输出
---
例如原始SQL为:
```sql
select id,name,common_name,dict_code,status from spd_test where ${where}
```
其中,${where}是全局的动态参数,这里面涉及到的数据不需要单独添加
如果前端传参查询了name, 会自动添加 `name like 输入的name值`,会生成如下SQL:
```sql
SELECT tmp.* FROM ( select id,name,common_name,dict_code,status from spd_test where 1=1 AND (name LIKE '%' || '测试' || '%') ) AS tmp LIMIT 10 OFFSET 0
```
如果name字段设置了联合搜索,即同时搜索common_name字段, 会生成如下SQL:
```sql
SELECT tmp.* FROM ( select id,name,common_name,dict_code,status from spd_test where 1=1 AND (name LIKE '%' || '测试' || '%' OR common_name LIKE '%' || '测试' || '%') ) AS tmp LIMIT 10 OFFSET 0
```
> 注意:如果是联合搜索,`联合搜索的字段` `必须` 要存在于 select 的字段中
>
> 关于联合搜索: 目前仅`支持` `显示类型` 为 `文本`的组件
### 关于ORDER BY XXX
如原始SQL为
```sql
select id,name,common_name,dict_code,status from spd_test where ${where} order by id
```
如传入,按照id asc排序,会生成一下SQL
```sql
SELECT tmp.* FROM ( select id,name,common_name,dict_code,status from spd_test where 1=1 AND (name LIKE '%' || '测试' || '%' OR common_name LIKE '%' || '测试' || '%') order by id ) AS tmp ORDER BY id desc LIMIT 10 OFFSET 0
```
如果是多条件,如先按照id asc, 再按照create_time desc
```sql
SELECT tmp.* FROM ( select id,name,common_name,dict_code,status,create_time from spd_test where 1=1 AND (name LIKE '%' || '测试' || '%' OR common_name LIKE '%' || '测试' || '%') order by id ) AS tmp ORDER BY id desc,create_time desc LIMIT 10 OFFSET 0
```
### 关于非$ {where}类型,如SQL内需要 按照create_time >= "搜索项的值"
```sql
select id,name,common_name,dict_code,status,create_time from spd_test where ${where} and update_time >= :create_time_start order by id
```
> 如上所示: create_time 是非${where}类型,需要使用`:`进行参数化, 如上所示 :create_time_start
> 同时,需要在 搜索项 中 勾选"SQL 内执行",非区间查询,在SQL中使用
> create_time_start 是create_time的开始时间,create_time_end 是create_time的结束时间,数字区间同理,fieldX_start/end
> 如果设置了该值,前端没有传入该值,会报错未找到XXX字段
### 关于默认值的变量
目前支持下拉框、日期选择(日期选择特殊,需在配置内设置)
> ${first} 选中第一个
> ${all} 选中全部
> 日期选择范围可选:
> `近7天` `近30天` `本月开始到今天` `本周开始到今天` `本季度开始到今天` `本年开始到今天` `上个季度`
> 日期可选
> `当前日` `本月第一天` `本月最后一天` `本周第一天` `本周最后一天` `上月第一天` `上月最后一天` `本季度第一天` `本季度最后一天` `本年第一天` `本年最后一天`
文本后续已规划、未完善的变量
> ${userBelongToDepts} 当前登录用户所属科室
```
```