请教个MSSQL 游标问题

mssql小白 2024-11-01 08:35:29

-- 向表格中插入一些示例数据  软件采集到的 是 xuhao和neirong 这2列 ,weixin和beizhu是自己加的 是人工翻阅时 看 neirong里有没有微信号码 手工填写
INSERT INTO TABLE (xuhao , neirong)
VALUES (1, '优化后微信:abc'),
       (2, '最近西班牙'),
       (3, '印度尼西亚VX:abc''),
       (4, '香港weixin:efg'')
        ;
----对上面的内容进行整理

xuhao 1 看到微信 abc 复制到 xuhao 1 weixin那一列;

xuhao 2里没有微信 列 微信就是空;

假设 xuhao 3那行没看到(假如表很多很多行 人工只看了很少一部分) ;

xuhao 4 看到微信 efg 复制到 xuhao 4 weixin 那一列
我用游标想实现:
1 把列weixin所有值放入游标(上面的是abc,efg),然后用这些值对neirong逐一模糊查询,如果匹配到,就把该weixin值放到该行的列weixin上,比如上面模糊搜索时发现了 xuhao3 里面abc 就把abc放到xuhao3 这行的列weixin;
2.后继续向这个表插入数据:

(5, '中邮渠道 V:lmn'') ,

(6, '中邮渠道 V:abc''),

先执行游标发现了 xuhao6 里面abc 就把abc放到xuhao6 这行的列weixin, 然后我们对weixin为空的数据进行查看,会看到xuhao 5里的lmn,于是把lmn复制到 xuhao 5 weixin 那一列 这时候再执行游标,weixin所有值就是 abc,efg,lmn了 然后用这3个值对neirong逐一模糊查询。。。。

不断重复这个过程,这个游标一直起作用。

...全文
196 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
雨夹雪 11-04
  • 打赏
  • 举报
回复
1人已打赏
1
--这不用你整理好的表,跟你需要更新的表关联匹配更新就好了呀
UPDATE a SET weixin = b.rst 
FROM #t a INNER JOIN 你整理好的微信表 b  ON a.neirong LIKE '%' +b.rst +'%'
 
雨夹雪 11-01
  • 打赏
  • 举报
回复

CREATE TABLE #t
(
xuhao  VARCHAR(100),
neirong VARCHAR(100),
weixin VARCHAR(100) 
) 

INSERT INTO #t (xuhao , neirong)
VALUES (1, '优化后微信:abc'),
       (2, '最近西班牙'),
       (3, '印度尼西亚VX:abc'),
       (4, '香港weixin:efg')


--匹配内容包含微信或weixin的数据
--然后截取从微信/weixin位置后+1开始到最后的内容(这个截取位置从哪开始到哪结束,要根据你真实内容分析来决定)
--然后用上面截取到的值跟原来的内容匹配,能匹配上的就更新
UPDATE a SET weixin = b.rst 
FROM #t a INNER JOIN 
( 
    SELECT 
    CASE 
    WHEN neirong LIKE '%微信%'   THEN   SUBSTRING(neirong, 3+ CHARINDEX('微信',neirong),1000)
    WHEN neirong LIKE '%weixin%'  THEN  SUBSTRING(neirong, 7+ CHARINDEX('weixin',neirong),1000)
    END  AS rst 
    FROM #t
    WHERE neirong LIKE '%微信%' OR neirong LIKE '%weixin%'
) b  ON a.neirong LIKE '%' +b.rst +'%'
 
--查看结果 
SELECT *  FROM #t  

DROP TABLE #t
  • 举报
回复
@雨夹雪 感谢耐心回复。这个方法和我想的不一样呢?neirong里 如果没有微信/weixin/vx/v字样 直接甩出来 abc/efg 如何处理?毕竟CASE WHEN THEN 无法匹配所有情况。我想用游标 1,先把目前整理好的weixin放进去游标;2,用这些weixin逐一对全部表数据进行模糊查询,匹配到了就更新beizhu;3,用beizhu更新weixin(beizhu不为空,weixin为空时 让weixin=beizhu);4,对于weixin为空的,继续看neirong里有没有疑似weixin号码的,整理到weixin;5,回到第1步了。
雨夹雪 11-04
  • 举报
回复
@mssql小白 如果没有微信/weixin/vx/v字样 直接甩出来 abc/efg 如何处理?这是你告诉我,你要用什么规则去识别,那我问你,你的第一步是怎么做的,难道还是手工?
  • 举报
回复
@雨夹雪 对的 手工;用了这个游标后 以后还是继续需要用到手工 节省的是对于重复出现的weixin数值 直接设置了 不需要手工了
2条回复
雨夹雪 11-01
  • 打赏
  • 举报
回复
--不是一句SQL可以搞定的吗,为什么要游标?
 UPDATE tiezi
    SET beizhu = weixin
    WHERE neirong like '%'+weixin+'%'
河狸吗 11-01
  • 举报
回复
@雨夹雪 哈哈哈哈我也觉得
  • 举报
回复
@雨夹雪 tiezi是不断更新的 weixin是根据neirong手工整理的 写游标是想后续进来的neirong里weixin重复时 直接更新 不再手工整理
  • 举报
回复
@雨夹雪 weixin字段是自己加的,是根据neirong里面有没有,手工整理的,采集下来的数据里没有这列。neirong会持续整理,只是已经整理出来的,可以对neirong进行模糊查询,自动设置beizhu,别重复整理。
1条回复
  • 打赏
  • 举报
回复

UPDATE tiezi
SET beizhu = @weixin
WHERE neirong like '%'+@weixin+'%'
我改了下:
UPDATE tiezi
SET beizhu = @weixin
WHERE weixin=@weixin and neirong like '%'+@weixin+'%' 可以更新了 感谢@河狸吗

河狸吗 11-01
  • 举报
回复
@mssql小白 你在update之前加个判断@weixin 不为空就更新
  • 举报
回复
@河狸吗 写游标是想实现把表数里手工整理出来的weixin逐一对内容进行模糊查询,如果匹配到了,就把该行的beizhu更为为该weixin
  • 举报
回复
@河狸吗 我这个写法还是不行,没实现想要的
河狸吗 11-01
  • 打赏
  • 举报
回复 1

要看@weixin是否为 ‘’,如果你beizhu也默认为 ‘’,这样更新当然看不出来有没有更新呀

34,696

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧