У меня есть столбец varchar в моей таблице SQL, и он отформатирован следующим образом:
Мне нужно изменить этот формат при запросе таблицы, чтобы он отображался в следующем формате:
Вы заметите, что в новом формате удалены 2 ведущих нуля.
Я сам пытался это сделать, используя следующие методы:
RIGHT(ColumnName, 4) AS NewColumnFormat
SUBSTRING(ColumnName, 3, 4) AS NewColumnFormat
Но когда я применяю это к числу типа 000010, оно отображается как 0001, а число типа 000001 отображается как 0000 и так далее.
Ниже приведен запрос, который я использовал:
SELECT DISTINCT TOP 1000
SUBSTRING(H.EMPREF, 3, 4) AS NewColumnFormat
,(SELECT TOP 1 CASE WHEN H1.[NEWVALUE] = 'E' THEN 'Employee' ELSE H1.[NEWVALUE] END FROM [HISTORY] H1 WHERE H1.[FIELDNAME] = 'EMPTYPE' AND H.[EMPREF] = H1.[EMPREF] ORDER BY H1.CHANGEDATE DESC) AS EMPTYPE
,(SELECT TOP 1 H2.[NEWVALUE] FROM [HISTORY] H2 WHERE H2.[FIELDNAME] = 'TITLE' AND H.[EMPREF] = H2.[EMPREF] ORDER BY H2.CHANGEDATE DESC) AS TITLE
,(SELECT TOP 1 H3.[NEWVALUE] FROM [HISTORY] H3 WHERE H3.[FIELDNAME] = 'FIRSTNAMES' AND H.[EMPREF] = H3.[EMPREF] ORDER BY H3.CHANGEDATE DESC) AS FIRSTNAMES
,(SELECT TOP 1 H4.[NEWVALUE] FROM [HISTORY] H4 WHERE H4.[FIELDNAME] = 'SURNAME' AND H.[EMPREF] = H4.[EMPREF] ORDER BY H4.CHANGEDATE DESC) AS SURNAME
,(SELECT TOP 1 H5.[NEWVALUE] FROM [HISTORY] H5 WHERE H5.[FIELDNAME] = 'DEPARTMENT' AND H.[EMPREF] = H5.[EMPREF] ORDER BY H5.CHANGEDATE DESC) AS DEPARTMENT
,(SELECT TOP 1 H6.[NEWVALUE] FROM [HISTORY] H6 WHERE H6.[FIELDNAME] = 'SECTIONMGR' AND H.[EMPREF] = H6.[EMPREF] ORDER BY H6.CHANGEDATE DESC) AS SECTIONMGR
,(SELECT TOP 1 H7.[NEWVALUE] FROM [HISTORY] H7 WHERE H7.[FIELDNAME] = 'HR2' AND H.[EMPREF] = H7.[EMPREF] ORDER BY H7.CHANGEDATE DESC) AS HR2
,(SELECT TOP 1 H9.[NEWVALUE] FROM [HISTORY] H9 WHERE H9.[FIELDNAME] = 'JOBTITLE' AND H.[EMPREF] = H9.[EMPREF] ORDER BY H9.CHANGEDATE DESC) AS JOBTITLE
FROM
[HISTORY] H
WHERE (H.TABLENAME = 'EMP' OR H.TABLENAME = 'OD' OR H.TABLENAME = 'SMS' OR H.TABLENAME = 'JD')
ORDER BY NewColumnFormat
Получаю следующий результат:
+-----------------+----------+-------+------------+---------+------------+------------+------+----------+
| NewColumnFormat | EMPTYPE | TITLE | FIRSTNAMES | SURNAME | DEPARTMENT | SECTIONMGR | HR2 | JOBTITLE |
+-----------------+----------+-------+------------+---------+------------+------------+------+----------+
| 0000 | Employee | Mr | Test | Record | LB | | NULL | |
| 0001 | Employee | Mr | Test | Record | AB | | NULL | |
| 0002 | Employee | Mr | Test | Record | LB | | NULL | |
| 0003 | Employee | Mr | Test | Record | LB | | NULL | |
| 0004 | Employee | Mr | Test | Record | BO | | NULL | |
| 0005 | Employee | Mr | Test | Record | BO | | NULL | |
| 0006 | Employee | Mr | Test | Record | AB | | NULL | |
| 0007 | Employee | Mr | Test | Record | RET | | NULL | |
| 0008 | Employee | Mr | Test | Record | DES | | NULL | |
+-----------------+----------+-------+------------+---------+------------+------------+------+----------+
Где я ошибаюсь, что формат «NewColumnFormat» отображается неправильно?


SELECT FORMAT(12, '0000') as pad_to_4
--> 0012
SELECT FORMAT(CONVERT(INT, '12'), '0000') as pad_to_4
--> 0012
SELECT FORMAT(CONVERT(INT, '000012'), '0000') as pad_to_4
--> 0012
Числа длиннее 4 остаются как есть (или теряют ведущие нули):
SELECT FORMAT(CONVERT(INT, '123456'), '0000') as pad_to_4
--> 123456
SELECT FORMAT(CONVERT(INT, '00123456'), '0000') as pad_to_4
--> 123456
But when I apply this to a number like 000010 it's appearing as 0001 and a number like 000001 is appearing as 0000 and so on.
Кстати, мне не удалось воспроизвести вашу жалобу:
SELECT RIGHT('000010', 4) AS NewColumnFormat
--> 0010
SELECT SUBSTRING('000010', 3, 4) AS NewColumnFormat
--> 0010
Это заставляет меня думать, что основная проблема - это что-то вроде того, что EMPREF не то, что вы думаете ...
Предложение SELECT FORMAT(CONVERT(INT, '12'), '0000') as pad_to_4 решило мою проблему, и я получаю правильное отображение результатов. Спасибо.
ОБНОВИТЬ MyTable НАБОР ColumnName = RIGHT (ColumnName, LEN (ColumnName) - 2);
Пожалуйста, дайте мне знать ваш результат. Спасибо.
SELECT LPAD (0000012,4,0)
--> 0012
LPAD, похоже, доступен в Mysql и pl-sql, но не реализован в SQL Server (вопрос помечен как)
Добавьте EMPREF к вашему выбору и обновите ваш «я получаю следующий результат», и я вам скажу