【问题标题】: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)))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-17
          • 1970-01-01
          相关资源
          最近更新 更多