如何使用 sql select 周围的值。(点)

How to select values around .(dot) using sql

我在 Teradata 中 运行 下面的查询:

sel requesttext from dbc.tables
where tablename='old_employee_table'

结果:

alter table  DB_NAME.employee_table,no fallback ;

我想使用 SQL 获得以下结果:

DB_NAME.employee_table

请求文本可以是: 创建集 table DB_NAME.employee_table;

DB 名称和 table 可以出现在结果中的任何位置。因为 .(dot) 加入了他们,所以我想用 .(dot) 分开。

基本上我需要 sql 这可以得到我周围的值 .(点) 我想要结果中的 DBName 和 Tablename。

您可以使用 regexp_substr()strtok() 来完成此操作。

正如 Jamie Zawinski 所说:

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.

所以我会选择 strtok() 方法。而且我很懒,正则表达式很难。

函数strtok()接受三个参数:

  1. 被拆分的字符串
  2. 分割字符串的分隔符
  3. 要抢的令牌数量。

要从查询返回的字符串中获取 <database>.<table>,我们可以用 space 分隔,获取第三个标记,然后用逗号分隔并获取第一个令牌。

看起来像:

SELECT strtok(strtok(requestText,' ',3),',',1) 
FROM dbc.tables
WHERE tablename='old_employee_table'

我不是 Teradata 的人,但这应该适用于目前给出的两个字符串,只要 teradata 的 regexp_substr() 支持积极的后视和积极的前瞻断言(我可能有 Teradata语法错误,因此可能需要进行一些调整):

SELECT REGEXP_SUBSTR(requesttext, '(?<= )(\w+\.\w+)(?=[,$]?)', 1, 1) 
FROM dbc.tables
WHERE tablename='old_employee_table'

参见 regex101 示例。希望它能轻松转换为 Teradata。

正则表达式查找 returns 句点两侧的单词,包括句点,前面是 space,后面是可选的逗号或行尾。