使用t-sql从现有列创建新列

时间:2014-05-14 18:04:39

标签: sql sql-server tsql

我正在尝试在新表中从现有列(表)创建新列。

这是我的旧表

projectnum       allw     budjet
648PE2075       152.00     230.00
648PE2075A      33.33      00.00
333AD0221B       125.11    1256.00
123CF0023        125.22     215.33

我需要创建一个新表,其中包含一个名为Project_code的新列,该列是从projectnum列和所有旧列创建的。 看起来像这样

projectnum   Project_code      allw       budjet
648PE2075       648-075       152.00     230.00
648PE2075A      648-075-A      33.33      00.00
333AD0221B      333-221-B      125.11    1256.00
123CF0023        123-023       125.22     215.33

我的挑战是当我尝试编写t_sql语句时。 projectnum的一些记录是10个字符休息9个字符。请帮助

3 个答案:

答案 0 :(得分:0)

SELECT
    projectnum,
    CASE LEN(projectnum) 
        WHEN 9 THEN LEFT(projectnum,3) + '-' + SUBSTRING(projectnum,6,3)
        WHEN 10 THEN LEFT(projectnum,3) + '-' + SUBSTRING(projectnum,6,3) + '-' + RIGHT(projectnum,1)
    END AS Project_code,
    allw,
    budjet
INTO MyNewTable
FROM MyOldTable

显然交换表名!这也将创建新表,如果您已经将表更改为只读它

INSERT INTO MyNewTable(projectnum,Project_code, allw, budjet)
SELECT
    projectnum,
    CASE LEN(projectnum) 
        WHEN 9 THEN LEFT(projectnum,3) + '-' + SUBSTRING(projectnum,6,3)
        WHEN 10 THEN LEFT(projectnum,3) + '-' + SUBSTRING(projectnum,6,3) + '-' + RIGHT(projectnum,1)
    END AS Project_code,
    allw,
    budjet
FROM MyOldTable

有更多优雅的解决方案可以提供更多选项,但希望这会有效,或者让您了解如何解决任何其他类似问题。

的Al。

答案 1 :(得分:0)

我建议使用select ... into ... from ...一步从现有数据创建新表。对于字符串操作substring()似乎是合适的。请尝试以下查询:

select
    projectnum,
    allw,
    budjet,
    substring(projectnum, 1, 3)
        + '-'
        + substring(projectnum, 7, 3)
        + case
            when len(projectnum) = 10
            then '-' + substring(projectnum, len(projectnum) - 1, 1) end
        as project_code

into
    new_table

from
    old_table

Microsoft Docs上的substring()了解详情。

答案 2 :(得分:0)

将其作为函数重用逻辑

create function code(@num varchar(20)) returns varchar(20) as
begin    
     return substring(@num, 1, 3) + '-' + substring(@num, 7, 3)
       + case when len(@num) = 10 then '-' + substring(@num, 10, 1) else '' end
end

根据需要使用

select dbo.code('648PE2075')
select dbo.code('648PE2075A')

您可以在需要时对其进行内联,因为它比UDF调用更快。

ADDED

如果你有很多行,那么内联仍然是更快的,但是表返回udf主要是快速且仍然可以恢复

e.g。

create function tblcode(@num varchar(20)) returns table as
   return select substring(@num, 1, 3) + '-' + substring(@num, 7, 3)
   + case when len(@num) = 10 then '-' + substring(@num, 10, 1) else '' end as code

并像

一样使用它
select * 
from ( select D.* from T.ProjectNum
cross apply dbo.tblcode(T.ProjectNum)
) as xx
cross apply dbo.tblcode(xx.project)