【问题标题】:SQL Query replace string with placeholderSQL查询用占位符替换字符串
【发布时间】:2020-06-09 12:59:25
【问题描述】:

我的表格有很多条目(图像路径)。这样的字符串是一个 URL,看起来像这样

https://example.com/images/do.php?id=1234

我必须将它们全部更改为这种格式

https://example.com/images/1234.png

所以“ID”等于文件名。仅替换 URL 并不难,但我必须添加静态文件扩展名,在我的例子中,它是 URL 字符串末尾的“png”。所以我需要这样的东西

UPDATE post SET message = REPLACE(message, 'https://example.com/images/do.php?id=', 'https://example.com/images/{id}.png');

我绝对不是有经验的 SQL 用户,所以请你帮帮我吗?

编辑//

现在我有这样的条目:

https://example.com/images/1234
https://example.com/images/5678

我需要添加静态文件扩展名的查询是什么?所以我的条目看起来像这样:

https://example.com/images/1234.png
https://example.com/images/5678.png

ID 的长度介于 4 到 6 个字符之间。我不能只添加扩展名的主要问题是,因为我的消息行确实包含更多文本,而不仅仅是要修改的 URL。这样的一行可以是这样的:

Here is your image link: [LINK]https://example.com/images/1234.png[/LINK] You can view it now.

Edit2//

我的名为“post”的数据库表如下所示

id   |   message
----------------
1    |   test
2    |   Here is your image link: [LINK]https://example.com/images/1234[/LINK] You can view it now.
3    |   some strings
4    |   Here is your image link: [LINK]https://example.com/images/5678[/LINK] You can view it now.
5    |   [LINK]no correct url[/LINK]
6    |   [LINK][IMG]https://example.com/images/9123[/IMG][/LINK]
7    |   [LINK]https://example.com/images/912364[/LINK]

因此,并非每个消息行都包含一个 url,也不是每个带有 [LINK] 标记的消息都包含一个正确的 url。还有一些条目的 ID 较长,不应更改。

【问题讨论】:

    标签: mysql sql replace mariadb


    【解决方案1】:

    第二个问题:

    UPDATE post
    SET message = concat(message,'.png')
    

    只需使用 '.png' 扩展您当前的条目 :-)

    编辑:所以,我的错!你应该试试正则表达式:

    UPDATE post
    SET message = CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/LINK\].*'))
    

    此语句断言不存在文件扩展名。因此,您可以在没有 where 子句的情况下运行该语句,因为文件扩展名不会加倍。 为了确保您可以在之前检查它:

    SELECT
        message
        ,CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/LINK\].*')) as corr_message
    FROM path
    

    检查模式以及例如Regex101.com 将您给定的示例作为字符串

    Here is your image link: [LINK]https://example.com/images/1234[/LINK] You can view it now.
    

    以下作为模式

    (.*https:\/\/example\.com\/images\/[0-9]{4,6})(\[\/LINK\].*)
    

    括号建立组。第一组是字符串的第一部分。在更新中,这是 Concat 的第一部分。之后我们将设置“.png”。更新语句的第三部分用第二组正则表达式表示。

    希望,这会对您有所帮助。 :)

    EDIT2:好的,这将适合您的行。

    UPDATE post
    SET message = CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/(IMG|LINK)\].*')) 
    WHERE message LIKE '%https://example.com/images/%'
    

    检查模式:

    (.*https:\/\/example\.com\/images\/[0-9]{4,6})(\[\/(IMG|LINK)\].*)
    

    作为更新前检查数据的选择:

    SELECT
        message
        ,CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/(IMG|LINK)\].*')) as corr_message
    FROM path
    WHERE message LIKE '%https://example.com/images/%'
    

    希望现在适合您的情况:)

    【讨论】:

    • 问题是消息行中的文本不仅仅是 url...这就是为什么我的想法是为 ID 设置某种占位符。我已经在我的问题中编辑了它
    • 这更近了一步,但它也选择了其他消息行,例如仅存储一些文本。
    • 我已经编辑了我的问题并添加了我的数据库表的方案
    【解决方案2】:

    这回答了问题的原始版本。

    这适用于您问题中的示例:

    select concat(substring_index(path, 'do.php', 1),
                  substring_index(path, '=', -1),
                  '.png')
    from (select 'https://example.com/images/do.php?id=1234' as path) x
    

    您可以轻松地将其转为update

    update post
        set message = concat(substring_index(message, 'do.php', 1),
                             substring_index(message, '=', -1),
                             '.png')
        where message like '%do.php%=%';
    

    【讨论】:

    • 这是完整的查询吗?
    • 存储了数百个这样的 URL,我必须替换它们。所以我还需要使用 UPDATE 语句吗?
    • 感谢您的更新。不幸的是,在查询之后,URL 看起来像这样:“h**ps://example.com/images/”
    • @andy 。 . .运行select 看看它是否返回你想要的。您还可以在描述中指定“url”,但在代码中添加一个名为 message 的列。
    • @andy 。 . .这似乎是一个不同的问题,应该作为一个 new 问题提出。您的原始问题已得到解答。
    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 2021-09-26
    • 2014-07-03
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多