【问题标题】:I need to remove leading zeros after a decimal point我需要删除小数点后的前导零
【发布时间】:2014-01-01 21:36:22
【问题描述】:
这是我第一次在这里发帖,我是一个基本的 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
【问题讨论】:
标签:
sql
sql-server
tsql
sql-server-2012
【解决方案1】:
如果格式是固定的,即YYYY.NNNNNNNNN,你可以只获取最后9个字符,将它们转换为int,将结果转换回varchar并连接回前5个字符:
LEFT([Year.Docid], 5) + CAST(CAST(RIGHT([Year.Docid], 9) AS int) AS varchar(10))
但是,将 Year 和 Docid 作为两个单独的 int 列存储在两个表中会更有意义。为输出组装它们比每次和加入它的结果时都进行此处理要容易得多。
【解决方案2】:
在 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】:
这有点工作,但完成了从点右侧删除零的任务:
SELECT SUBSTRING(YearDocid, 0, CHARINDEX('.', yearDocId)) +
REPLACE(SUBSTRING(yearDocId,
CHARINDEX('.', yearDocId),
LEN(yearDocID)),
'0', '')
FROM tab1;
sqlfiddle demo
【解决方案4】:
将长格式转换为短格式:
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
【解决方案5】:
从 Tbl_sample 中选择 CONCAT(PARSENAME([Col_Varchar],2),'.',CONVERT(INT,PARSENAME([Col_Varchar],1)))