本文介绍Postgresql如何实现动态SQL语句。

1. 动态SQL

动态SQL在程序启动时会根据输入参数替换相应变量。使用动态SQL可以创建更强大和灵活的应用程序,但在编译时SQL语句的全文不确定,因此运行时编译会牺牲一些性能。动态SQL可以是代码或SQL语句的一部分,动态部分要么由开发人员输入,要么由程序本身创建。

1.1 动态SQL使用场景

在PL/pgSQL函数或过程中有时需要生成动态命令,因为命令涉及不同表或数据类型,仅在运行时才能确定具体对象或值。这时比较适合使用动态SQL。

另外,在特定情况下,如果静态SQL语句无法执行,或者您真的不知道函数或过程要执行的确切SQL语句,那么您必须使用动态SQL。

1.2 动态SQL VS 静态SQL

动态SQL 静态SQL
SQL语句在编译时编译 SQL语句在运行时编译
SQL语句在编译时进行解析,有效性检查表、视图和过程。编译时优化并生成应用程序执行计划 SQL语句在运行时进行编译解析SQL语句,有效性检查表、视图和过程,优化并生成应用程序执行计划
性能好,速度快 与静态SQL相比较性能不好
不够灵活 非常灵活

2. 生成动态SQL

共有三种方式实现动态SQL。使用format函数,使用quote_ident 和 quote_literal函数,使用连接操作符||(发音pipe),我最喜欢使用第一种,下面分别进行说明。

注意:构建查询时插入的动态值需要仔细处理,因为可能需要包含引号。

2.1 使用format函数

首先我们介绍下format函数的形式参数:

%s s格式化参数值作为简单字符串.
%I I 处理参数值作为SQL 标识符,有必要增加双引号.
%L L 引用参数作为SQL字面值.

这里先要区分两个概念:SQL标识符和SQL字面值。

SQL标识符表示数据库名称、表名、索引名、schema名、约束名、游标名、触发器、列、视图名称。在动态SQL中,I%会按照SQL标识符进行解析。

SQL字面值表示显示值,数值、字符、字符串、布尔值,不代表SQL标识符。有不同类型的字面值:

类型 举例
字符串 String ‘Hello! everyone’
整数 Integer 45, 78, +89 , -465,6E5
数值 Decimal 45.56
日期 DateTime ‘5/20/2020’ , TIMESTAMP ‘2020-05-20 12:01:01’;
字符 Character A’ ‘%’ ‘9’ ’ ’ ‘z’ ‘(’
布尔 Boolean true, false, null

下面举例说明:

SELECT format('Hello! Welcome to my %s!', 'Blog') as msg;

返回:Hello! Welcome to my Blog!

SELECT format('%s! Welcome to my %s! - %s','Hi','Blog','Ourtechroom') as msg;

返回 :Hi! Welcome to my Blog! - Ourtechroom

SELECT format('INSERT INTO %I VALUES(%L)', 'tbl_test', 'test');

返回:INSERT INTO tbl_test VALUES('test')

这里%I 被替换为tbl_test,%L被替换为'test'

2.2 使用quote_indent 函数

PostgreSQL 的quote_indent 函数

quote_ident('Hello World');  // "Hello World" 字面量增加引号quote_ident('mytable');  // mytable 表名称自动去掉引号quote_ident('MyTable');  // MyTable 区分大小写,表名称自动去掉引号

除此之外还有几个类似函数。 QUOTE_LITERAL(string text), QUOTE_LITERAL(value anyelement), QUOTE_NULLABLE(value anyelement);

QUOTE_LITERAL函数返回值自动增加引号。QUOTE_NULLABLE对于非空参数增加引号,否则返回null。

2.3 使用连接操作符||

举例:

 select ' be.id from ' || tbl_name || ' t where m.commodity_id = ' || sorttype  || ' order by t.amount ' ||  test_id  ||;

这种方式对于需要增加单引号比较麻烦,且容易造成SQL注入。

3. 总结

本文介绍Postgresql三种方式实现动态SQL语句,并通过示例对比不同方式的差异。相比使用format方式更简单高效。

Postgresql实现动态SQL语句相关推荐

  1. xml模糊查询语句_2Mybatis学习笔记07:动态SQL语句(原创,转载请注明来源)

    开发环境: 硬件环境:Windows10+JDK 1.8: 软件环境:Java+Eclipse+Mybatis+maven3.6+tomcat8.0+Postgresql 10.6: 用到的jar包: ...

  2. Oracle基础 动态SQL语句

    一.静态SQL和动态SQL的概念. 1.静态SQL 静态SQL是我们常用的使用SQL语句的方式,就是编写PL/SQL时,SQL语句已经编写好了.因为静态SQL是在编写程序时就确定了,我们只能使用SQL ...

  3. 动态SQL语句--mybatis

    转自:http://www.blogjava.net/Steven-bot/articles/363460.html 动态SQL语句--mybatis 动态SQL语句         有些时候,sql ...

  4. oracle中执行动态sql语句吗,oracle中有没有可动态执行sql语句的函数

    oracle中有没有可动态执行sql语句的函数 关注:233  答案:2  手机版 解决时间 2021-03-05 15:53 提问者祗剩寂寞 2021-03-04 22:38 oracle中有没有可 ...

  5. Mybatis Plus 是如何实现动态 SQL 语句的?原理你懂吗?

    作者 | 稻草江南 来源 | https://juejin.cn/post/6883081187103866894 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,那么它是怎么 ...

  6. Sql Server实用操作-动态sql语句基本语法

    如何将exec执行结果放入变量中? declare @num int, @sqls nvarchar(4000) set @sqls='select @a=count(*) from tableNam ...

  7. IBatis.net动态SQL语句

    在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&quo ...

  8. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

  9. MyBatis——动态SQL语句——if标签和where标签复合使用

    功能需求 根据性别和名字查询用户 官方文档 MyBatis--动态 SQL SQL语句 SELECT id, username, birthday, sex, address FROM `user` ...

最新文章

  1. oracle之alter学习笔记
  2. 常用和不常用端口一览表收藏
  3. python 画log曲线
  4. mysql优化sql相关(持续补充)
  5. OpenGL之glMatrixMode函数的用法
  6. git reset HEAD^
  7. mysql怎么给表设置查询语句_MySQL查询语句简单操作示例
  8. linux虚拟arm环境环境,Ubuntu 模拟ARM开发环境
  9. 图像处理五:python读取图片的几种方式
  10. 使用FZip创建压缩文件保存到桌面
  11. IDEA插件系列-玩转JSON与实体类互相转换
  12. JavaSE JDK搭建
  13. 侠客风云传服务器维护,侠客风云传服务器地址
  14. c语言自学 中文,C语言自学《一》 ---- 初探C语言
  15. 《指数型组织》学习总结
  16. 2011年09月04日
  17. python xlrd 错误:xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF reco
  18. adb常用命令以及使用
  19. 【BZOJ 3470】3470: Freda’s Walk 期望
  20. 计算机慢的解决方法,几种电脑变慢的解决方法

热门文章

  1. 一个伟大游戏的诞生,怎么少得了“云”?
  2. PHP对于数据库的基本操作——插入
  3. Slidev快速入门
  4. 如何使用商业画布进行人员管理
  5. 进程调度(处理机调度)
  6. 计算机网络安全期末考试题成都信息工程大学,计算机网络术基础(考试).成都信息工程学院.doc...
  7. python字节流处理_一篇文章带你剖析Python 字节流处理神器struct
  8. Android 官方网站地址
  9. hive FULLJOIN中实现部分数据FULLJOIN另一部分数据LEFTJOIN的结果
  10. C#笔记--StreamReader