【问题标题】:Vertica SQL - pull a specific value in a column,Vertica SQL - 拉取列中的特定值,
【发布时间】:2020-08-01 08:26:37
【问题描述】:

这里是垂直 SQL 的初学者。

我们的数据库中有一个名为 TEXT 的列。它有一堆我想手动解析的信息。

下面的例子

TEXT
Age = 51, Country = USA, State = NY, ..... 

我将如何进行子查询并搜索特定字符串并提取该值?意思是,

如果文本包含“年龄”和相应的值,则选择文本?

非常感谢您的帮助,已在 Excel 中手动解析它..

谢谢!

【问题讨论】:

标签: sql regex string select vertica


【解决方案1】:

如果你经常需要这个,写一个函数。 然后用它来创建一个真实的表,其中“key”变成了列名——还有一个数字字符串,比如“51”变成了一个INTEGER,而不是一个VARCHAR......

这是一个函数定义和一个运行测试...

CREATE OR REPLACE FUNCTION val (
  s VARCHAR
, k VARCHAR
)
RETURN VARCHAR AS 
BEGIN
  RETURN REGEXP_SUBSTR(s,k||'\s*=\s*([^,]+),?',1,1,'i',1);
END;


WITH input(s,k) AS (
            SELECT 'Age = 51, Country = USA, State = NY','Age'
  UNION ALL SELECT 'Age = 51, Country = USA, State = NY','Country'
  UNION ALL SELECT 'Age = 51, Country = USA, State = NY','State'
)
SELECT
  *
, val(s,k)
FROM input;
                  s                  |    k    | val 
-------------------------------------+---------+-----
 Age = 51, Country = USA, State = NY | Age     | 51
 Age = 51, Country = USA, State = NY | Country | USA
 Age = 51, Country = USA, State = NY | State   | NY


【讨论】:

    【解决方案2】:

    正如 Gordon Linoff 所说,您应该真正修复您的设计,并将每个值存储在单独的列中,而不是在需要解析的单个列中存储一个字符串。

    与此同时,一种选择是使用regexp function regexp_substr()

     regexp_substr(text, 'Age\s*=\s*(\S+)', 1, 1, '', 1)
    

    'Age\s*=\s*(\S+)' 表示:

    • 文字字符串'Age'
    • 0 到 n 个空格
    • 乱七八糟的'='
    • 0 到 n 个空格
    • 尽可能多的字符而不是空格(至少 1 个)

    括号捕获最后一部分,然后您可以使用函数的最后一个参数返回(1 表示应返回第一个捕获的组)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2018-08-27
      相关资源
      最近更新 更多