从SQL中删除两组前导零

时间:2014-05-06 17:30:06

标签: sql sql-server tsql decimal

我有一组看起来像这样的数据;

DOCUMENT_ID
===
019239.03491
019239.03497
019239.03498
019239.03500
019239.03501
019239.03503
019239.03514
019239.03521
019168.00845
019168.00846
019168.00847
019168.00848
019168.00850
019168.00860
019168.00861
019168.00866
019168.00867
019168.00868
019168.00869
019168.00870

我需要从字段的最左边部分删除前导零,并在小数点后删除前导零。请注意,可能有多个前导零。换句话说,我需要上面的数据看起来像下面的数据;

 Doc_Number
17516.1178
17517.2083
17517.2630
17517.2972
17517.3365
17519.4004
17520.3395
17520.3461
17520.3695
17520.3918
17520.4378
17520.582

任何信息或帮助都会有所帮助。我正在使用MS SQL SERVER 2012。

2 个答案:

答案 0 :(得分:1)

Double Casts相当不错。


    CREATE TABLE DOCS( DOCUMENT_ID VARCHAR(13) );

    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019239.03491');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019239.03497');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019239.03498');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019239.03500');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019239.03501');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019239.03503');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019239.03514');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019239.03521');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00845');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00846');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00847');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00848');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00850');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00860');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00861');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00866');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00867');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00868');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00869');
    INSERT INTO DOCS (DOCUMENT_ID) VALUES ('019168.00870');


    SELECT 
      CAST(CAST(LEFT(DOCUMENT_ID,CHARINDEX('.',DOCUMENT_ID)-1) AS INT) AS VARCHAR(13))
      + '.' +
      CAST(CAST(RIGHT(DOCUMENT_ID,CHARINDEX('.',REVERSE(DOCUMENT_ID))-1) AS INT) AS VARCHAR(13))
      AS NEW_DOCUMENT_ID

    FROM DOCS

结果:

NEW_DOCUMENT_ID
19239.3491
19239.3497
19239.3498
19239.3500
19239.3501
19239.3503
19239.3514
19239.3521
19168.845
19168.846
19168.847
19168.848
19168.850
19168.860
19168.861
19168.866
19168.867
19168.868
19168.869
19168.870

检查a SQLFiddle

答案 1 :(得分:0)

测试数据

DECLARE @TABLE TABLE(Doc_ID VARCHAR(20))
INSERT INTO @TABLE VALUES 
('019168.00861'),
('019168.00866'),
('019168.00867'),
('019168.00868'),
('019168.00869'),
('019168.00870'),
('19168.870')

<强>查询

SELECT CASE WHEN LEFT(Doc_ID, 1) = '0' 
               THEN SUBSTRING(Doc_ID, 2, CHARINDEX('.',Doc_ID)-1 ) 
            ELSE SUBSTRING(Doc_ID, 1, CHARINDEX('.',Doc_ID)) END 
        + CASE WHEN LEFT(SUBSTRING(Doc_ID, CHARINDEX('.',Doc_ID)+ 1, LEN(Doc_ID)), 1) = '0'
           THEN SUBSTRING(Doc_ID, CHARINDEX('.',Doc_ID)+ 2, LEN(Doc_ID))
            ELSE SUBSTRING(Doc_ID, CHARINDEX('.',Doc_ID)+ 1, LEN(Doc_ID))
            END 
                AS FinalValue
FROM @TABLE

结果集

╔════════════╗
║ FinalValue ║
╠════════════╣
║ 19168.0861 ║
║ 19168.0866 ║
║ 19168.0867 ║
║ 19168.0868 ║
║ 19168.0869 ║
║ 19168.0870 ║
║ 19168.870  ║
╚════════════╝