2017-05-03 91 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