【问题标题】:SQL: get a substring by removing character off the right and leftSQL:通过删除左右字符来获取子字符串
【发布时间】:2012-07-18 00:21:17
【问题描述】:

我有一列值,例如:

 [{"run_status":1,"daily_budget":"2000","campaign_id":"60952315"}].

删除第一个和最后一个括号的查询是什么,所以我留下了

 {"run_status":1,"daily_budget":"2000","campaign_id":"60952315"}    

如果您的答案取决于 SQL 版本,我正在使用 Hive。

【问题讨论】:

  • “Hive 定义了一种简单的 SQL-like 查询语言,称为 QL,它使熟悉 SQL 的用户能够查询数据。” hive.apache.org/docs/r0.9.0

标签: sql string substring hive


【解决方案1】:

这是快速和肮脏的,但另一种方法是创建一个值数组来替换和迭代它们。

    declare @origString varchar(150)
        ,@newString varchar(150)
        , @replace varchar(10)
        , @replace2 varchar(10)
        , @replaceValue varchar(10)

    set @replaceValue =''
    set @replace = '['
    set @replace2 =']'
    set @origString = '[{"run_status":1,"daily_budget":"2000","campaign_id":"60952315"}]'

    select REPLACE(REPLACE(@origString, @replace, @replaceValue), @replace2, @replaceValue)

【讨论】:

  • Iterate 是在 SQL 上下文中使用的错误词(通常)。只要这两个字符出现的唯一位置是存储字符串的开头/结尾,此设置也是安全的 - 如果它在其他任何地方,您的结果是“未定义”。
  • 感谢您提供信息,开发人员回答了一个 sql 问题(编写我自己的所有查询、sp 等),因此像 iterate 这样的术语自然而然。我总是愿意学习,所以如果在这种情况下迭代不正确,那么正确的术语是什么?环形?另外,如果我可能会问,您将如何为提出的问题编写 sql?同样,开发人员总是愿意学习思考问题的新方法。
  • 正如其他人所发布的那样,SUBSTR()(尤其是如果确实是第一个/最后一个字符)可能是更好的选择。 “迭代”表明在多行上(单独)执行相同的功能。您嵌套的REPLACE() 并没有让我觉得满足这个要求。此外,由于 SQL 应该是基于 set 的,因此实际迭代(具有实际循环结构)几乎总是 错误 要做的事情。像命令式程序一样处理 SQL 可能最终会与引擎发生冲突。
【解决方案2】:

数据库中的字符串操作通常在不同版本之间有所不同。在 Hive 中,您需要:

select substr(<val>, 2, length(<val>) - 2)

【讨论】:

    【解决方案3】:

    您可以使用 SUBSTR:

    SUBSTR(string source_str, int start_position [,int length]), SUBSTRING(string source_str, int start_position [,int length])

    http://www.folkstalk.com/2011/11/string-functions-in-hive.html

    【讨论】:

      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 2023-04-06
      • 2021-12-11
      相关资源
      最近更新 更多