以独立于数据库的方式使用零填充SQL(LPAD)

时间:2011-12-29 18:01:36

标签: mysql sql sql-server postgresql firebird

我有一张如下表格:

code ---> INTEGER
name ---> CHAR

+------+------+
| code | name |
+------+------+
|  1   |  aa  |
|  2   |  bb  |
|  3   |  cc  |

我想以这种方式用代码字段左边的零填充:

SELECT LPAD(code,5,'0') FROM table;

此查询在MySQL中运行良好,但它不适用于SQL Server和PostgreSQL,我正在寻找适用于所有数据库或至少在这四种数据库上的查询:

  • MySQL的
  • 的PostgreSQL
  • MSSQL
  • 火鸟

没有任何变化。有解决方案吗?

3 个答案:

答案 0 :(得分:8)

正确答案是“在您的客户中做到这一点” RDBMS级别没有单一的解决方案

但是,对于SQL Server 2012 (是的,下一个版本),PostgreSQL和MySQL,您可以这样做:

RIGHT(CONCAT('00000', code), 5)
  • 较新的PostgreSQL确实有LPAD,SQL Server没有
  • 各种FORMAT函数不兼容(但需要等到SQL Server 2012)
  • RIGHT是一致的,但字符串连接运算符是不同的
  • 在SQL Server 2012中添加了CONCAT功能

答案 1 :(得分:1)

有点弱,但有一种选择是在前面添加一些零,然后从右边取最后的x个字符。

例如,

select '0000000000' || code from table;

will produce
00000000001
00000000002
00000000003

然后子串结果会给你

select substr('0000000000' || code, -5) from table;

00001
00002
00003

我不记得这四个数据库中的连接和子串函数是否相同。但我猜想也许你正在寻找一种方法来做到比你已经做的更通用,并且可能就是这样。虽然为整体丑陋道歉。

答案 2 :(得分:0)

在Firebird 2.5中,您可以使用如下查询:

select right('00000' || cast(code as varchar(20)), 5) from table