我有这段代码:
WITH CTE AS
(
SELECT
LTRIM(RTRIM([EMP_ID])) AS empID
FROM
[SAMPLE].[dbo].[segments]
)
SELECT
(CASE WHEN LEN(LTRIM(RTRIM(EMPID))) = 5
THEN RIGHT(('100' + EMPID), 8)
WHEN LEN(LTRIM(RTRIM(EMPID))) = 6
THEN RIGHT(('10' + EMPID), 8)
WHEN LEN(EMPID) = 7
THEN RIGHT('10' + (LEFT(LTRIM(EMPID), 6)), 8)
ELSE empID
END) EMP_ID
FROM CTE
我想要做的是使用上述状态将我的emp_id
列更新为新的8位数字ID。现在运行脚本正确地返回ID我只需要更新表。
我尝试了以下操作,所做的就是使所有ID都相同
WITH CTE AS
(
SELECT
LTRIM(RTRIM([EMP_ID])) AS empID
FROM
[SAMPLE].[dbo].[segments]
)
UPDATE segments
SET EMP_ID = (case when len(ltrim(rtrim(EMPID))) = 5 then right(('100' + EMPID),8 )
when len(ltrim(rtrim(EMPID))) = 6 then right(('10' + EMPID),8 )
when len(EMPID) = 7 then right('10'+(left(ltrim(EMPID),6)),8)
else empID
end)
FROM CTE
用于此的正确UPDATE
语句是什么?
答案 0 :(得分:1)
在common table expression中添加基本列并直接更新cte
:
;with cte as (
select
emp_id
, empid = '1'+replicate('0',7-len(ltrim(rtrim([emp_id]))))+ltrim(rtrim(emp_id))
from segments
where len(ltrim(rtrim([emp_id]))) < 8
)
update cte set emp_id = empid;
select *
from segments;
rextester演示:http://rextester.com/YKO33009
返回:
+----------+
| emp_id |
+----------+
| 88888888 |
| 17777777 |
| 10666666 |
| 10055555 |
| 10004444 |
| 10000333 |
| 10000022 |
| 10000001 |
+----------+
来自此测试设置:
create table segments (emp_id char(8))
insert into segments values
('88888888')
,('7777777')
,('666666')
,('55555')
,('4444')
,('333')
,('22')
,('1');
答案 1 :(得分:1)
如果修剪后的emp_id中最左边的5或6个字符都是数字,则可以执行以下操作:
UPDATE [SAMPLE].[dbo].[segments]
SET EMP_ID = cast(10000000 + cast(ltrim(rtrim( case when len(ltrim(rtrim(emp_id))) > 6 then left(ltrim(rtrim(emp_Id)),6) else ltrim(rtrim(emp_id)) end)) as int) as char(8))
如果您分两步执行此操作,则可以更容易理解:
UPDATE [SAMPLE].[dbo].[segments]
SET Emp_ID = rtrim(ltrim(Emp_ID))
UPDATE [SAMPLE].[dbo].[segments]
SET EMP_ID = cast(10000000 + cast(case when len(emp_id) > 6 then left(emp_Id,6) else emp_id end as int) as char(8))
虽然我强烈怀疑即使这不是必要的,但您的EMP_ID值已被修剪。如果您知道7个字符的场景也是数字的话,它可能会变得更简单。
最后,对于没有UPDATE
的{{1}}次查询,我感到非常紧张。这次你真的可能意味着它......但是它仍然可怕运行。
答案 2 :(得分:0)
如果没有CTE,您可以尝试
UPDATE segments
SET EMP_ID = (case when len(ltrim(rtrim(EMP_ID))) = 5 then right(('100' + EMP_ID),8 )
when len(ltrim(rtrim(EMP_ID))) = 6 then right(('10' + EMP_ID),8 )
when len(EMP_ID) = 7 then right('10'+(left(ltrim(EMP_ID),6)),8)
else emp_ID
end)
如果您想使用CTE,可以尝试
With CTE
As
(
SELECT ltrim(rtrim([EMP_ID])) as empIDTrim
, Emp_ID
FROM [SAMPLE].[dbo].[segments]
)
UPDATE CTE
SET EMP_ID = (case when len(empIDTrim)= 5
then right('100' + empIDTrim,8 )
when len(empIDTrim)= 6
then right('10' + empIDTrim ,8 )
when len(empIDTrim) = 7
then right('10'+left(empIDTrim,6),8)
else empIDTrim
end)