PostgreSQL 9.3 格式化拼接字符串

2013-05-06 08:39:20|  分类: PgSQL Develop|举报|字号 订阅

PostgreSQL 9.3 引入的一个格式化输出函数, 有点类似C的sprintf用法.

语法如下 :

format(formatstr text [, formatarg "any" [, ...] ])

其中formatstr是需要格式化的字符串, 包含普通字符以及格式字符.

后面的动态参数用来替换formatstr中的格式字符.

格式字符的语法如下 :

%[position][flags][width]type

其中position, flags, width都是可选项. type是必须的.

1. position 指变量位置.

A string of the form n$ where n is the index of the argument to print. Index 1 means the first argument after formatstr. If the position is omitted, the default is to use the next argument in sequence.

注意the next argument是指前一个已经取过的位置的下一个位置.

2. flags目前只有-, 且需要与width配合使用, -表示右补齐, 没有-表示左补齐.

Additional options controlling how the format specifier‘s output is formatted. Currently the only supported flag is a minus sign (-) which will cause the format specifier‘s output to be left-justified. This has no effect unless the width field is also specified.

width指显示的宽度, 当宽度大于实际字符串时用空格补齐, 当宽度小于实际字符串长度时不会截断字符串, 相当于width不起作用. width也可以使用3. format函数的参数值来代替直接写在formatstr中.


Specifies the minimum number of characters to use to display the format specifier‘s output. The output is padded on the left or right (depending on the - flag) with spaces as needed to fill the width. A too-small width does not cause truncation of the output, but is simply ignored. The width may be specified using any of the following:

a positive integer;

an asterisk (*) to use the next function argument as the width;

or a string of the form *n$ to use the nth function argument as the width.

If the width comes from a function argument, that argument is consumed before the argument that is used for the format specifier‘s value. If the width argument is negative, the result is left aligned (as if the - flag had been specified) within a field of length abs(width).

注意如果同一个格式中宽度用到了参数, 那么宽度优先消耗这个参数. 因此如果没有指定位置时, 默认会消耗下一个参数. 也就是宽度消耗的参数的下一个参数.

4. type指字符串类型, 目前可以使用s, I, L. 分别表示字符串, identified, 和literal.


The type of format conversion to use to produce the format specifier‘s output. The following types are supported:

s formats the argument value as a simple string. A null value is treated as an empty string.

I treats the argument value as an SQL identifier, double-quoting it if necessary. It is an error for the value to be null.

L quotes the argument value as an SQL literal. A null value is displayed as the string NULL, without quotes.

In addition to the format specifiers described above, the special sequence %% may be used to output a literal % character.

[使用举例]

1.

digoal=# select format (‘|abc|%*2$s|‘, E‘wab c\t‘, ‘10‘, ‘ab c‘);      format      ------------------ |abc|      ab c|(1 row)

*2$指width取第二个参数. 10

s指字符串, 这里去下一个参数也就是第三个参数‘ab c‘

2.

digoal=# select format (‘|abc|%*s|‘,‘8‘, E‘wab c‘, ‘10‘, ‘ab c‘);     format     ---------------- |abc|   wab c|(1 row)

*指width, 取下一个参数. 因为前面没有取过任何参数, 所以这里是‘8‘

s指字符串, 这里去下一个参数也就是第2个参数E‘wab c‘.

3.

digoal=# select format (‘|abc|%-*s|‘,‘8‘, E‘wab c‘, ‘10‘, ‘ab c‘);     format     ---------------- |abc|wab c   |(1 row)

*指width, 取下一个参数. 因为前面没有取过任何参数, 所以这里是‘8‘

s指字符串, 这里去下一个参数也就是第2个参数E‘wab c‘.

- 表示右边补齐

4.

postgres=# select format (‘|abc|%3$-*s|‘,‘4‘, E‘wab c‘, ‘10‘, ‘ab c‘);   format   ------------ |abc|10  |(1 row)

这里的*取的是第一个参数‘4‘, 因为前面没有取过参数, 从1开始.

digoal=# select format (‘|abc|%2$s|%3$-*s|‘,‘4‘, E‘wab c‘, ‘10‘, ‘ab c‘);         format         ------------------------ |abc|wab c|10        |(1 row)

这里的*取的是第3个参数. 也就是%2$后面的一个参数.

%3$-*s这个格式中, 是先取width参数, 再取其他参数的.

5.

digoal=# select format (‘|abc|%2$I|%3$-*I|‘,‘4‘, E‘wab c‘, ‘10‘, ‘ab c‘);          format          -------------------------- |abc|"wab c"|"10"      |(1 row)

I指identified, 类似表名, 字段名. 所以如果是包含了特殊字符则需要用双引号.

digoal=# select format (‘|abc|%2$I|%3$-*I|‘,‘4‘, E‘wABc‘, ‘10‘, ‘ab c‘);         format          ------------------------- |abc|"wABc"|"10"      |(1 row)digoal=# select format (‘|abc|%2$I|%3$-*I|‘,‘4‘, E‘wabc‘, ‘10‘, ‘ab c‘);        format         ----------------------- |abc|wabc|"10"      |(1 row)

6.

digoal=# select format (‘|abc|%2$L|%3$-*L|‘,‘4‘, E‘wa\bc\t‘, ‘10‘, ‘ab c‘);            format             ------------------------------- |abc|‘wa\x08c   ‘|‘10‘      |(1 row)digoal=# select format (‘|abc|%2$L|%3$-*L|‘,‘4‘, E‘wa\bc\t\\‘, ‘10‘, ‘ab c‘);             format              --------------------------------- |abc|E‘wa\x08c  \\‘|‘10‘      |(1 row)

L指literal, 类似字符串类型的值, 所以涉及逃逸. 如山.

7.

因此format可用于构造动态SQL.


SELECT format(‘INSERT INTO %I VALUES(%L)‘, ‘Foo bar‘, E‘O\‘Reilly‘);

Result: INSERT INTO "Foo bar" VALUES(‘O‘‘Reilly‘)

SELECT format(‘INSERT INTO %I VALUES(%L)‘, ‘locations‘, E‘C:\\Program Files‘);

Result: INSERT INTO locations VALUES(E‘C:\\Program Files‘)

【参考】

1. http://www.postgresql.org/docs/devel/static/functions-string.html

2. http://www.postgresql.org/docs/devel/static/plpgsql-statements.html#PLPGSQL-QUOTE-LITERAL-EXAMPLE

3. man 3 sprintf

时间: 2024-10-31 21:38:47

PostgreSQL 9.3 格式化拼接字符串的相关文章

详解Python拼接字符串的七种方式

忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串.相信不少同学会有同感. 几乎任何一种编程语言,都把字符串列为最基础和不可或缺的数据类型.而拼接字符串是必备的一种技能.今天,我跟大家一起来学习Python拼接字符串的七种方式. 1.来自C语言的%方式 print('%s %s' % ('Hello', 'world')) >>> Hello world %号格式化字符串的方式继承自古老的C语言,这在很多编程语言都有类似的实现.上例的%s是一个占位符,它仅代表

Python拼接字符串的7种方法总结

前言 忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串.相信不少同学会有同感. 在Python中,我们经常会遇到字符串的拼接问题,几乎任何一种编程语言,都把字符串列为最基础和不可或缺的数据类型.而拼接字符串是必备的一种技能.今天,我跟大家一起来学习Python拼接字符串的七种方式. 下面话不多说了,来一起看看详细的介绍吧 1.来自C语言的%方式 print('%s %s' % ('Hello', 'world')) >>> Hello world %号格式化

关于前端js拼接字符串的一点小经验

1.今天在做项目的时候遇到一个问题,就是使用onclick="xxx()"  点击事件的时候,参数如果为全数字就会出现点击无反应的问题.但是当参数为字符串或者动态内容的时候就会出现事件无法响应.比如onclick="add("abc")";这样在add方法中无法获取到参数. 解决办法:是用转移字符,onclick="add(\'abc\')";这样在方法中就可以使用了.         2.还有一个是在做拼接字符串的时候,如果

拼接字符串,生成tree格式的JSON数组

之前做的执法文书的工作,现在需要从C#版本移植到网页版,从Thrift接口获取数据,加载到对应的控件中 之前用的easyui的Tree插件,通过<ul><li><span></span></li></ul>标签的方式生成node树,条理清晰,虽然麻烦点,但是用循环写几行代码就能搞定,但是,在Ajax的函数里面,tree的样式加载不上,显示的格式就是元素自带的含义,<ul>和<li>,无法点击,下面的工作也就无法

JavaScript 优雅简单的拼接字符串

前言 最近维护一个老系统,里面有大量js拼接字符串的代码,这里总计一下js拼接字符串 JS 原生字符串拼接 JavaScript里面的字符串可以直接用 + 来拼接 return "<a style='text-decoration:underline' onClick='" + valsAr[1] + " return false;" + "' data-rowId='" + row_id + "' href='javascrip

js拼接字符串传值,子窗口传值

避免下次再去查资料,记录一下 1.拼接字符串传值 "UpdateState?ids=" + subStr+"&remark="+reValue) 目标页面接受:public ActionResult UpdateState(string ids, string remark) 2.弹出窗口传值 弹出子窗口:var reValue = window.showModalDialog('Dialog', obj, 'dialogWidth=120px;dialog

SSRS 2012 参数化报表 -- 利用拼接字符串来取代查询参数

SSRS 2012 参数化报表 -- 利用拼接字符串来取代查询参数 以上介绍过了如何在SQL Server中使用参数化查询,但是,如果遇到一些不支持参数化查询的数据库又该怎么办呢?此时,最终极的招数就是整个查询语句都通过参数化查询以拼接字符串的方式来产生. 举例来说,除了XML文件之外,SSRS也能够接收外部Web Services返回的数据集以产生报表.在以下的实例中,利用立陶宛国家银行所提供的实时汇率换算Web服务,它提供各种货币与立陶宛币(Litas)的汇率换算. 步骤1: 请将数据表拖拉

参数化操作数据库,不用拼接字符串

说明:之前操作数据库一直都是用拼接字符串,发现很多时候做了很多重复工作,并且还要在每个输入的地方放sql注入,实在是麻烦. 用参数传递,则不用担心sql注入的风险(具体为何,不清楚). SqlParameter[] para = new SqlParameter[] { new SqlParameter("@user_name",SqlDbType.NVarChar,10), new SqlParameter("@user_sex",SqlDbType.NVarCh

knockoutJS学习笔记01:从拼接字符串到编写模板引擎

开篇 关于knockout的文章,园里已经有很多大神写过了,而且都写得很好.其实knockout学习起来还是很容易的,看看官网的demo和园里的文章,练习练习就可以上手了(仅限使用,不包含研究源码).之所以想写这个系列,主要是想记录自己的学习和应用过程,也希望能给初学者一点帮助. 既然是学习过程就一步一步来,从最开始的解决方案,到优化过程,到最后的实现方案.有了思考和对比,才会更加明白这个东西有什么好处,为什么使用它.什么情况要使用它.ok, 官网学习链接为?:knockoutJS 准备例子 过