2017-10-30 7 views
0

からSQL Serverテーブル:更新CTEとケースの文

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 

私は何をしたいの新しい8桁のIDに私のemp_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文は何ですか?

+1

を試すことができますか?なぜCTEですか? – Eric

+0

EmpIDに数字以外の文字が含まれていますか? –

+0

ああ、すでに文字列の長さが5文字で、3を前に付けることをチェックしたときには、文字列を再び8にトリムする必要はありません。 6と2と同じです。 –

答えて

0

あなたは

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) 
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'); 
+0

説明とヒントについては、SqlZimに感謝します。これもうまくいった。とても有難い。 – spittingfire

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文字のシナリオも数字であることがわかっているなら、それはもっと簡単になるかもしれません。

最後に、私は実際にはのクエリについては、WHEREで緊張します。今度はあなたが本当にこのことを意味する可能性がありますが、実行するのはまだ怖いです。

CTEなし
+0

Joel Coehoornさん、ありがとうございました。 – spittingfire

+0

はい私はあなたの意見を得るが、これは一度の取引になります - 私たちはすべてのEMP_IDを5,6,7桁から8桁に移動しています。その結果、私が持っている履歴データは新しい8桁のIDに変換する必要があります。 – sly123

関連する問題