2017-05-03 185 views
0

我原來的表有這樣一個值:下面我執行下面的查詢更新記錄 - 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 

我的意料:

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

但是,我越來越喜歡以下(這是錯誤的)

id  TELPHONE  
----------- -------------- 
    1923  12126276572 
1949  12122126670825    
2125  1212       
1926  12126670825 

我做錯了什麼。以及如何得到預期的結果?

+0

老實說,輸出看起來就像你編碼的東西。我懷疑是RowID 2125,你有問題嗎? –

回答

1

我沒有正確更新與此(我省略你的地方的條件):

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條件以及電話<>'和簡化的情況下(卸下和第二,當我的情況下):

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與您不希望在第一個表達式中匹配的行匹配。重新排列你case讓您的212檢查至上,因爲這是一個積極的唯一匹配,並且如果不符合,才檢查陰性比賽上1212

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',所以它跟在'charindex('1212',TELEPHONE,1)= 0'路由的情況下,在開始時增加了'1212'。如果這不是你想要它的行爲,改變你的'case'語句。 – iamdave

+0

@TryingBest我已經添加了一個額外的標準來檢查你的空白值。 – iamdave