SQL 动态语句

1. 问题

在实际的数据库查询案例中,很少有像上一节中查询条件固定且每个查询条件必定会传的例子。

更常见的情况是,一个用户查询功能,可能有的用户单独通过用户名查询,有的用户单独通过年龄查询,用的两者都有。这个时候如果按照这些使用场景一一对应地写查询 SQL 明显是不明智的,因为随着将来查询条件的增多,SQL 配置文件会变得越来越大且越来越多冗余信息,维护将是一场噩梦。

SQL 动态语句就是用来解决这个问题的。

2. 基础语法

SQL 动态语句的语法为:{?and field like #field#},其中大括号包裹住的语句中 Leap 要求一定要有且仅有一个命名参数占位符

根据这个命名参数占位符是否有对应的参数值传过来,Leap 将决定这整个语句是否加入最后执行的 SQL 中。

例如我们将上一节 SQL 使用 SQL 动态语句重写:

select * 
from User 
where 1 = 1
{? and name = #name# } 
{? and age = #age# }

这样重写之后,传进来的参数如果不为 null 则在最后执行前会加入参数所在的语句块,为 null 则不加入。

例如我们现在传入参数 name 为 null,age 为 18,则最后执行的 SQL 为:

select *
from User
where 1 = 1
and age = 18

这里的 1 = 1 不是必须的,在有固定查询条件在前面的情况下就不需要了。

3. nullable 语法

看来 SQL 动态语句已经能很好解决我们一开始提到的问题,但是还有一种情况我们需要考虑,就是如果确实是需要查询字段值为 null 的情况呢?

我们可以在 SQL 动态语句的大括号内后面加上 ;nullable:true

例如上例我们改为 name 字段可以查询为 null 值的情况:

select *
from User
where 1 = 1
{? and name = #name# ;nullable:true}
{? and age = #age# }

假如我们现在还是像上例传入参数 name 为 null,age 为 18,则最后执行的 SQL 为:

select *
from User
where 1 = 1
and name = null
and age = 18

这个时候只有我们单单传 age 参数和值而不传 name 参数和值时,最后执行 SQL 才为:

select *
from User
where 1 = 1
and age = 18

代码中如何传入对应参数将在后面章节介绍。

上一篇:SQL 占位符 下一篇:SQL 执行

results matching ""

    No results matching ""