Teradata 以相反的顺序搜索字符串

Teradata search for a string in reverse order

我们正在从 MS SQL 进行转换。 原码为

reverse(ltrim(rtrim(substring(reverse("string"),1,(charindex(' ',reverse("string")))))))

所以它所做的是在末尾搜索一个字符串,直到找到 space,它获取该字符串作为它的值

EX。

'ABCD 123'结果是'123'

'STEP 12 3-2'结果是'3-2'

到目前为止我有这个 SELECT substr('ABCDE 1234', character('ABCDE 1234')-2) 但不知道如何在 Teradata 中进行反向搜索:(

您可以尝试以下操作:

查询:

select strtok('STEP 12 3-2',' ',character_length('STEP 12 3-2') - character_length(Oreplace('STEP 12 3-2',' ',''))+1)

输出:

3-2

查询:

select strtok('ABCD 123',' ',character_length('ABCD 123') - character_length(Oreplace('ABCD 123',' ',''))+1)

输出:

123

strtok 用特定的分隔符打断字符串,而 character_length + oreplace 会给我们 "space".

的出现次数

substr + instr

select  'ABCD 123'                      as str
       ,substr(str,instr(str,' ',-1)+1) as token
;       

+----------+-------+
|   str    | token |
+----------+-------+
| ABCD 123 |   123 |
+----------+-------+

select  'STEP 12 3-2'                   as str
       ,substr(str,instr(str,' ',-1)+1) as token
;       

+-------------+-------+
|     str     | token |
+-------------+-------+
| STEP 12 3-2 |  3-2  |
+-------------+-------+

regexp_substr(如果您知道正则表达式就非常简单,但 CPU 成本更高)

select  'ABCD 123'                  as str
       ,regexp_substr(str,'[^ ]*$') as token
;       

+----------+-------+
|   str    | token |
+----------+-------+
| ABCD 123 |   123 |
+----------+-------+

select  'STEP 12 3-2'                   as str
       ,regexp_substr(str,'[^ ]*$') as token
;       

+-------------+-------+
|     str     | token |
+-------------+-------+
| STEP 12 3-2 |  3-2  |
+-------------+-------+