2017-05-03 16 views
0

私のオリジナルの表に、このような値を持っていますUPDATEレコード - SQL Serverの

ID   TELPHONE 
    ----------- -------------- 
    1923  6276572 
    1949  2126670825 
    2125 
    1926  12126670825 

私は以下のように予想される結果を得るために、クエリの下に実行しています:

UPDATE #T 
SET  TELEPHONE = CASE 
        WHEN CHARINDEX('1212', TELEPHONE, 1) = 0 THEN 
    '1212'+TELEPHONE 

     WHEN CHARINDEX('212', TELEPHONE , 1) = 1 THEN '1'+TELEPHONE 

     ELSE TELEPHONE 

       END 
WHERE (STATE LIKE '%UU%' OR STATE LIKE '%U&P%' OR STATE LIKE '%UTTER%') AND 
LEN(TELEPHONE) <= 10 

MY期待:

ID   TELPHONE 
----------- -------------- 
1923  12126276572 
1949  12126670825 
2125 
1926  12126670825 

しかし、私は

(間違っている)以下のように取得しています
id  TELPHONE  
----------- -------------- 
    1923  12126276572 
1949  12122126670825    
2125  1212       
1926  12126670825 

私は間違っています。そして、どのように期待される結果を得るか?

+0

正直なところ、出力はあなたがコーディングしたものとまったく同じように見えます。私はRowID 2125に問題があると思われますか? –

答えて

1
これは、正のみ一致し、それが満たされない場合にのみ、 1212に負の試合をチェックしているよう 212のためのあなたのチェックが最初に来るように、あなたの caseを並べ替え

私はこれで正しいの更新をしました(私はあなたのどこ条件省略):

UPDATE TELE SET TELPHONE = CASE WHEN CHARINDEX('212', TELPHONE , 1) = 1 THEN '1'+TELPHONE 
           WHEN CHARINDEX('1212', TELPHONE, 1) = 0 AND TELPHONE<>'' THEN '1212'+TELPHONE        
         ELSE TELPHONE 
         END 

を。 出力:

+------+-------------+ 
| ID | TELPHONE | 
+------+-------------+ 
| 1923 | 12126276572 | 
| 1949 | 12126670825 | 
| 2125 |    | 
| 1926 | 12126670825 | 
+------+-------------+ 

私はあなたがWHERE条件AND TELEPHONE <> '' に追加して、(取り外しと二時に私の例で)場合を簡略化することができれば性能は良くなると思う:

UPDATE TELE SET TELPHONE = CASE WHEN CHARINDEX('212', TELPHONE , 1) = 1 THEN '1'+TELPHONE 
           WHEN CHARINDEX('1212', TELPHONE, 1) = 0 THEN '1212'+TELPHONE        
         ELSE TELPHONE 
         END     
    WHERE --(STATE LIKE '%UU%' OR STATE LIKE '%U&P%' OR STATE LIKE '%UTTER%') 
     --AND 
     LEN(TELPHONE) <= 10 AND TELPHONE<>''; 
0

これは、caseが最初の式では不要な行に一致しているためです。

declare @t table (
       ID  int 
       ,TELEPHONE nvarchar(50) 
       ); 
insert into @t 
values (1923,'6276572'), 
     (1949,'2126670825'), 
     (2125,''), 
     (1926,'12126670825'); 

select Telephone 
     ,case when charindex('212',TELEPHONE,1) = 1 
       then '1'+TELEPHONE 
       when charindex('1212',TELEPHONE,1) = 0 
        and TELEPHONE <> '' 
       then '1212'+TELEPHONE 
       else TELEPHONE 
       end as TelephoneNew 
     ,charindex('212',TELEPHONE,1) as [212Match] 
     ,charindex('1212',TELEPHONE,1) as [1212Match] 
from @t 

を出力:

+-------------+--------------+----------+-----------+ 
| Telephone | TelephoneNew | 212Match | 1212Match | 
+-------------+--------------+----------+-----------+ 
|  6276572 | 12126276572 |  0 |   0 | 
| 2126670825 | 12126670825 |  1 |   0 | 
|    |    |  0 |   0 | 
| 12126670825 | 12126670825 |  2 |   1 | 
+-------------+--------------+----------+-----------+ 
+0

なぜ空白が更新されていますか?それはID = 2125です。更新しないでください。私はこれを空白にしたいと思いました.1millonの空白のレコードがあるので、他の解決策はありません そのままですか? – AskMe

+0

あなたの 'case'ステートメントに否定的なチェックがあるので。 2つの 'match'カラムからわかるように、空の行は両方の' charindex'チェックのために '0 'を返しますので、' char12(TELEPHONE、1)= 0'ルートの '開始に '1212 'を追加します。どのように動作させたいのでない場合は、 'case'文を変更してください。 – iamdave

+0

@TryingBest空白の値をチェックする追加基準を追加しました。 – iamdave

関連する問題