日期:2014-05-16  浏览次数:20594 次

SQL2008,表名AA,列名电话卡,当电话卡中有“移动”或“联通”或“电信”或“数据卡”时,只保留该文字,其余文字删除,求语句?
表名AA

列名:电话卡
广西移动183卡
联通156
云南电信卡
飞马数据卡

想变成下面的格式
列名:电话卡
移动
联通
电信
数据卡

求语句,谢谢!
------解决方案--------------------
----------------------------------------------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2014-03-18 11:46:24
-- Verstion:
--      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
-- Jul  9 2008 14:43:34 
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Enterprise Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([电话卡] varchar(13))
insert [tb]
select '广西移动183卡' union all
select '联通156' union all
select '云南电信卡' union all
select '飞马数据卡'
--------------开始查询--------------------------
SELECT CASE WHEN PATINDEX('%移动%',电话卡)>0 THEN '移动'  
WHEN PATINDEX('%联通%',电话卡)>0 THEN '联通'
WHEN PATINDEX('%电信%',电话卡)>0 THEN '电信'
WHEN PATINDEX('%数据卡%',电话卡)>0 THEN '数据卡'
   ELSE '' 
   END   FROM tb 
----------------结果----------------------------
/* ------
移动
联通
电信
数据卡

(4 行受影响)

*/

------解决方案--------------------
update 表名AA set 电话卡=
CASE 
WHEN PATINDEX('%移动%',电话卡)>0 THEN '移动'              
WHEN PATINDEX('%联通%',电话卡)>0 THEN '联通'            
WHEN PATINDEX('%电信%',电话卡)>0 THEN '电信'            
WHEN PATINDEX('%数据卡%',电话卡)>0 THEN '数据卡'       
ELSE ''        
END  
------解决方案--------------------
UPDATE  tb
SET     [电话卡] = CASE WHEN PATINDEX('%移动%', 电话卡) > 0 THEN '移动'
                     WHEN PATINDEX('%联通%', 电话卡) > 0 THEN '联通'
                     WHEN PATINDEX('%电信%', 电话卡) > 0 THEN '电信'
                     WHEN PATINDEX('%数据卡%', 电话卡) > 0 THEN '数据卡'
                     ELSE ''
                END
   
如果需要判断的情况很多,建议加个字典表来匹配
------解决方案------------------