SQL Padding с нулями (LPAD) независимым от базы данных способом - PullRequest
2 голосов
/ 29 декабря 2011

У меня есть таблица, подобная следующей:

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
  • Firebird

без изменений. Есть ли решение?

Ответы [ 3 ]

8 голосов
/ 29 декабря 2011

Правильный ответ: «сделай это в своем клиенте».
На уровне СУБД не существует единого решения

Однако для SQL Server 2012 (да, следующий выпуск), PostgreSQL и MySQL вы можете сделать это:

RIGHT(CONCAT('00000', code), 5)
  • Более новый PostgreSQL имеет LPAD, SQL Server не
  • Различные функции FORMAT несовместимы (но опять жедождитесь SQL Server 2012)
  • ПРАВО согласованно, но операторы конкатенации строк различны
  • Функция CONCAT добавлена ​​в SQL Server 2012
1 голос
/ 29 декабря 2011

Вид слабого, но один из вариантов - добавить несколько нулей вперед, а затем взять последние x символов справа.

Например,

select '0000000000' || code from table;

will produce
00000000001
00000000002
00000000003

Тогда подстрока результатов даст вам

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

00001
00002
00003

Я не могу вспомнить, совпадают ли функции сцепления и подстроки в этих четырех базах данных.Но я догадался, что, возможно, вы ищете способ сделать это более общим, чем то, что вы уже делаете, и это может быть так.Извиняюсь за общее уродство, хотя.

0 голосов
/ 29 декабря 2011

В Firebird 2.5 вы можете использовать такой запрос:

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