如何使用 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()
接受三个参数:
- 被拆分的字符串
- 分割字符串的分隔符
- 要抢的令牌数量。
要从查询返回的字符串中获取 <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,后面是可选的逗号或行尾。
我在 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()
接受三个参数:
- 被拆分的字符串
- 分割字符串的分隔符
- 要抢的令牌数量。
要从查询返回的字符串中获取 <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,后面是可选的逗号或行尾。