我正在尝试在新表中从现有列(表)创建新列。
这是我的旧表
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个字符。请帮助
答案 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)