如何在SQL中删除一些(不是全部)前导零

时间:2018-11-15 11:06:38

标签: sql tsql

我的varchar表中有一个SQL列,其格式如下:

  • 000001
  • 006420
  • 000100
  • 009999

查询表时,我需要更改此格式,以使其显示为以下格式:

  • 0001
  • 6420
  • 0100
  • 9999

您会注意到,新格式已删除了两个前导零。

我已经尝试使用以下方法进行此操作:

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”的格式显示不正确的地方在哪里呢?

3 个答案:

答案 0 :(得分:2)

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
  

但是,当我将其应用于000010之类的数字时,它显示为0001,而像000001之类的数字则显示为0000,依此类推。

顺便说一下,我无法复制您的投诉:

SELECT RIGHT('000010', 4) AS NewColumnFormat
--> 0010

SELECT SUBSTRING('000010', 3, 4) AS NewColumnFormat
--> 0010

这让我认为基本问题是EMPREF所涉及的问题,而不是您所想的。

答案 1 :(得分:0)

更新MyTable SET ColumnName = RIGHT(ColumnName,LEN(ColumnName)-2);

请让我知道您的结果。谢谢。

答案 2 :(得分:0)

SELECT LPAD (0000012,4,0)
--> 0012