【问题标题】:Replace first character in SQL替换 SQL 中的第一个字符
【发布时间】:2020-10-12 17:21:38
【问题描述】:

我正在尝试替换字符串的第一个字符。我可以使用replace() 函数替换特定字符。但不确定如何替换列中所有字符串的 first 字符。

样本数据:

Column1
43449927
13448927
53443457

将第一个字符替换为“7”后的预期结果:

Column1
73449927
73448927
73443457

【问题讨论】:

  • 这不是有效的 PostgreSQL,但是,UPDATE table SET Column1 = CONCAT("7", SUBSTRING(Column1, 1)) 是基本逻辑。不要将第一个值替换,而是将“7”和一个子字符串(除第一个字符之外的所有字符)连接在一起。
  • 这是将 7 与现有值连接起来
  • 我不熟悉 Postgres 语法,但看起来你会使用 substring(Column1 from 2) 来获取除第一个字符之外的所有字符,然后将“7”连接到 @987654327 的结果@。 postgresql.org/docs/9.1/functions-string.html。看起来这个函数是从 1 开始而不是从 0 开始的,所以试试Column1 from 2
  • @WOUNDEDStevenJones,但感谢您的想法,我得到了实现它的解决方案
  • 你也可以考虑overlay()函数。

标签: sql postgresql replace


【解决方案1】:

right() 带有 偏移量是最短和最快的:

'7' || right(column1, -1)

replace() 不够聪明,无法将 position 作为模式。必须是regexp_replace():

regexp_replace(column1, '^.', '7')

但是正则表达式更昂贵。

细微的区别:后者返回一个空字符串 ('') 用于空字符串输入,因为没有什么可以替换。如果这是您需要的行为,并且您仍然希望获得最佳性能,请将第一个行为包含在(便宜!)CASE 表达式中:

CASE WHEN column1 <> ''
     THEN '7' || right(column1, -1)
     ELSE column1 END

作为参考:在 Linux 上对 Postgres 12 的快速测试中,right() 的表达式为 ...

  • ~ 比添加 CASE 的速度快 10 %。

  • ~ 比仅使用“from”参数的 substr() 快 25 %。

  • ~ 2 倍快 substr() 与冗余“计数”参数(长度)。

  • ~ 是overlay(column1 PLACING '7' FROM 1) 的 3 倍。

  • ~ 10 倍于regexp_repace()

dbfiddle here

中带有扩展测试用例的测试矩阵

【讨论】:

    【解决方案2】:

    对于字符数据:

    update mytable set data= '7' || substr(mycolumn, 2);
    

    【讨论】:

    • 这也是将 7 与现有值连接起来
    • 我已经修正了我的答案。
    【解决方案3】:

    以下语法对我有帮助,

    '7' || substr(column1, 2, length(column1))
    

    【讨论】:

    • 在这种情况下,实际上不需要第二个函数参数。 @pifor 提供了更高级的形式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多