我需要在小数点后删除前导零

时间:2013-12-13 23:54:48

标签: sql sql-server tsql sql-server-2012

这是我第一次在这里发帖,我是一名基本的SQL用户,需要帮助。

我有一个varchar列,用于存储如下数据:

Year.Docid
2007.000000001
2007.000000002
2007.000000003
2007.000000004
2007.000000005
2007.000000006

我需要将此数据加入到另一个没有小数点后全零的表中,有人可以告诉我如何使数据看起来如下所示:

Year Docid
2007.1
2007.2
2007.3
2007.4
2007.5
2007.6

我正在使用MICROSOFT SQL SERVER 2012

5 个答案:

答案 0 :(得分:3)

如果格式是固定的,即YYYY.NNNNNNNNN,您可以获取最后9个字符,将它们转换为int,将结果转换回varchar并连接回第一个5个字符:

LEFT([Year.Docid], 5) + CAST(CAST(RIGHT([Year.Docid], 9) AS int) AS varchar(10))

但是,在两个表中将Year和Docid存储为两个单独的int列会更有意义。只为输出组装它们比每次加入它的结果时更容易组装它们。

答案 1 :(得分:0)

将长格式转换为短格式:

SELECT LEFT('2007.000000001',5) + CAST(CAST(RIGHT('2007.000000001',LEN('2007.000000001')-5) AS int)AS VARCHAR)

...

要在联接中使用它:

SELECT
...
FROM
   TABLE_1 T1
   INNER JOIN TABLE_2 T2
   ON LEFT(T1.pk,5) + CAST(CAST(RIGHT(T1.pk,LEN(T1.pk)-5) AS int)AS VARCHAR) = T2.pk

答案 2 :(得分:0)

在SQL Server中,假设两列都是varchar,这样的事情应该是:

select *
from table_1 t1
join table_2 t2 on t2.docid = left(t2.docid,4)
                            + '.'
                            + convert(varchar,convert(int,right( t2.docid, len(t2.docid)-5 )))

您应该记住,将一个表的列设为表达式意味着对于该表/列,查询优化器不能使用查询计划中的任何索引。

答案 3 :(得分:0)

这是一项工作,但是完成了从点右侧删除零的任务:

SELECT SUBSTRING(YearDocid, 0, CHARINDEX('.', yearDocId)) + 
       REPLACE(SUBSTRING(yearDocId, 
                         CHARINDEX('.', yearDocId), 
                         LEN(yearDocID)), 
               '0', '')
FROM tab1;

sqlfiddle demo

答案 4 :(得分:-1)

SELECT CONCAT(PARSENAME([Col_Varchar],2),'。',CONVERT(INT,PARSENAME([Col_Varchar],1)))FROM Tbl_sample