Как удалить некоторые (не все) ведущие нули в SQL

У меня есть столбец varchar в моей таблице SQL, и он отформатирован следующим образом:

  • 000001
  • 006420
  • 000100
  • 009999

Мне нужно изменить этот формат при запросе таблицы, чтобы он отображался в следующем формате:

  • 0001
  • 6420
  • 0100
  • 9999

Вы заметите, что в новом формате удалены 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» отображается неправильно?

Добавьте EMPREF к вашему выбору и обновите ваш «я получаю следующий результат», и я вам скажу

Caius Jard 15.11.2018 12:16
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
63
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
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 решило мою проблему, и я получаю правильное отображение результатов. Спасибо.

slee423 15.11.2018 12:47

ОБНОВИТЬ MyTable НАБОР ColumnName = RIGHT (ColumnName, LEN (ColumnName) - 2);

Пожалуйста, дайте мне знать ваш результат. Спасибо.

SELECT LPAD (0000012,4,0)
--> 0012
LPAD, похоже, доступен в Mysql и pl-sql, но не реализован в SQL Server (вопрос помечен как)
Bridge 15.11.2018 12:26

Другие вопросы по теме