代码之家  ›  专栏  ›  技术社区  ›  Avinash

选择字符串的一部分并在SQL Server中更新

  •  0
  • Avinash  · 技术社区  · 5 年前

    我有一个数据如下

    +-------+----------------------------------------------+
    | ID    | COMMENT                                      |
    +-------+----------------------------------------------+
    | 3118- | Replace Id.NO 3117-52-96 Was wrongly updated |
    +-------+----------------------------------------------+
    | 4857  | Replace Id.NO.4875-21-96-due to 2 mistake    |
    +-------+----------------------------------------------+
    | 5877  | replace .ID NO 5876.69.49 due mistake 101    |
    +-------+----------------------------------------------+
    | 1254  | Replace Id No. 1259-93-87 due to mistake 81  |
    +-------+----------------------------------------------+
    

    我想得到 No 在说话之前。比如下面

    +-------+----------------------------------------------+------------+
    | ID    | COMMENT                                      | NEW_VALUE  |
    +-------+----------------------------------------------+------------+
    | 3118- | Replace Id.NO 3117-52-96 Was wrongly updated | 3117-52-96 |
    +-------+----------------------------------------------+------------+
    | 4857  | Replace Id.NO.4875-21-96-due to mistake      | 4875-21-96 |
    +-------+----------------------------------------------+------------+
    | 5877  | replace .ID NO 5876.69.49 due mistake        | 5876.69.49 |
    +-------+----------------------------------------------+------------+
    | 1254  | Replace Id No. 1259-93-87 due to mistake     | 1259-93-87 |
    +-------+----------------------------------------------+------------+
    

    然后我必须更新 ID NEW_VALUE .一旦我拿到 新价值 ,它将很容易更新。

    我试过的。

    SELECT ID,COMMENT,
    REPLACE(REPLACE(COMMENT,'Replace Id.NO',''),'Replace Id.NO.','')FROM MYTABLE
    

    如上所述,我使用了多个( 10点左右 ) REPLACE 以获得我所需的价值。我相信应该有一些简单的方法。

    1 回复  |  直到 5 年前
        1
  •  3
  •   Thom A    5 年前

    有一个建议:

    SELECT V.ID,
           V.Comment,
           SUBSTRING(V.Comment,PI.I+3,CI.I) AS NewComment
    FROM (VALUES(3118,'Replace Id.NO 3117-52-96 Was wrongly updated'),
                (4857,'Replace Id.NO.4875-21-96-due to 2 mistake'),
                (5877,'replace .ID NO 5876.69.49 due mistake 101'),
                (1254,'Replace Id No. 1259-93-87 due to mistake 81'))V(ID,Comment)
          CROSS APPLY (VALUES(PATINDEX('%No[ .]%', V.Comment)))PI(I)
          CROSS APPLY (VALUES(PATINDEX('%[^0-9.-]%',STUFF(V.Comment,1,PI.I+3,'')))) CI(I);
    

    这使用 PATINDEX 找到 'No ' / 'No.' ,然后是字符的第一个位置 不是吗 若干分隔符( 0-9 或者 . - 性格)。

    请注意,对于字符串 'Replace Id.NO.4875-21-96-due to 2 mistake' 价值 '4875-21-96-' 由于值的尾部分隔符,返回。

    理想情况下,你需要做的是修复你的设计,我想这就是为什么你要这么做。因此,由于数据不佳,您可能需要手动“清理”任何异常。

        2
  •  1
  •   Yogesh Sharma    5 年前

    你可以用 PATINDEX() :

    SELECT mt.id, mt.COMMENT, SUBSTRING(mt.comment, PATINDEX('%[0-9]%', mt.comment)-1, 10)
    FROM MYTABLE mt;
    

    这将假设评论只有一个数字&包含10个长度。

    编辑:

    SELECT mt.id, mt.COMMENT, SUBSTRING(mtt.comments, 1, PATINDEX('%[A-Z]%', mtt.comments)-2)
    FROM MYTABLE mt CROSS APPLY
         ( VALUES (SUBSTRING(mt.comment, PATINDEX('%[0-9]%', mt.comment), LEN(mt.comment)))
         ) tt(comments)