【问题标题】:teradata sql - regexp_substr to split on ' - 'teradata sql - regexp_substr 在“ - ”上拆分
【发布时间】:2021-12-06 19:51:24
【问题描述】:

我对 Teradata 有点陌生。我更熟悉 Presto SQL,其中 split_part 可用。

我希望在空格、连字符、空格 (' - ') 上拆分字符串。

示例:“沃尔玛 - 目标 - 百思买 - K-Mart - 史泰博”

我习惯使用 split_part(split_part(COLUMN, ' - ',2), ' - '), 1) 来获取 Target,它忽略了 Wal-Mart 和 K-Mart 中的连字符,因为连字符不是前后加一个空格。

但是,我不知道如何使用 Teradata 获取“目标”。
strtok() 似乎只适用于单个字符,这还不够,因为我想在 3 (' - ') 上拆分。

任何帮助将不胜感激!

【问题讨论】:

  • 您也许可以使用 REGEXP_SPLIT_TO_TABLE 它可以有一个多字符模式。但是对于 REGEXP_SUBSTR 尝试 '(^|(\ -\ ))\K.*?(?=($|\ -\ ))' 的模式。
  • 这一定是有史以来最糟糕的分隔符。
  • 实际上空格不需要转义,除非你使用 matcharg 'x' 所以你可以使用稍微简单的'(^|( - ))\K.*?(?=($|( - )))'

标签: sql regex teradata regexp-substr


【解决方案1】:

根据您的版本(14.0 或最新版本),您可以使用 strtok 解析它

select strtok(oreplace('Wal-Mart - Target - Costco - K-Mart - Staples',' - ','|'),'|',2)

【讨论】:

  • strtok 无法识别它只是在连字符上分割的空格,由于 wal-mart 中的连字符,这不起作用。
  • @acvbasql 我进行了修改,将 3 个字符组合替换为管道字符,以便稍后拆分。这行得通吗?
  • 好主意!我认为这会奏效。我仍然对正则表达式解决方案感到好奇,但这暂时可行。谢谢!
【解决方案2】:

虽然不是一个直接的答案,但也许它有助于逻辑,所以冒着被激怒的风险,我还是把它扔在这里。使用正则表达式,您应该能够首先用简单的语言描述您的模式,以帮助分析和定义您真正需要获得的内容。即,您希望第二次出现由模式空格-破折号-空格包围的字符串。如果模式位于行的开头或结尾怎么办?让我们修改一下。您希望指定的字符串出现在行的开头(可选地或模式空格-破折号-空格)之前,然后是空格-破折号-空格或行尾。

在 Oracle 中,参数列表中的第一个“2”表示获取模式的第二次出现,第二个“2”表示返回第二个记住的组(在括号中)。 WITH 语句只是设置数据。您必须将此正则表达式转换为 Teradata。

WITH tbl(str) AS (
  SELECT 'Wal-Mart - Target - Best Buy - K-Mart - Staples' FROM dual
)
SELECT REGEXP_SUBSTR(str, '(^?| - )(.*?)( - |$)', 1, 2, NULL, 2) retailer
FROM tbl;

RETAILER
--------
Target  
1 row selected.

Play with query here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-12
    • 2014-07-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多