我有一列的字符串很长,在某个地方(不在精确的位置)是我要提取的3位数字。字符串的该部分可以是另一个单列表的已定义列表中的任何内容。
因此,如果字符串的一部分包含一列中定义的值,请返回该值。如何使用Informix SQL做到这一点?
谢谢!
这是我要从中提取信息的字符串:
Insert nalog14: 8880888802981130 GERARD BUTLER KLEVER STR.37 null XANTEN GERMANY null null null 0045000000000 COMERZ AGILE AD null 02085020 01 null Wed Feb 05 00:00:00 CET 2020 978 null 6496.14 NL69ABNA0494540044 Brandsma Yachtservice Eeltjebaasweg 6-8 Sneek THE NETHERLAND 00 528 A 528 null ABNANL2AXXX DOMESTICUSAMSTERDAM This is some random text 130 Invoice number 112362 Repair of Brandsma Vlet Winter Storage Brandsma Vlet null S null 0 null 000 0 null 0 null 1 GERADS SE
并且说这是我的参考列:
220
150
400
300
130
112
...
因此,我的字符串在字符串的“这是一些随机文本”部分之后包含值“ 130”,并且该值也在引用列中。
我想要的输出只是从字符串中提取该值。
130
还有一个问题是,我想要提取的字符串的一部分也可以出现在字符串的其他位置,如您在一开始所看到的8880888802981 130,但这是偶然发生的。我只能识别的模式是所需的输出始终在前后被空格隔开。
我希望这会有所帮助。
我假设存在一个带有以下内容的表Table1
:
CREATE TABLE Table1 ( …, line LVARCHAR, … );
CREATE TABLE Table2 (number CHAR(3) NOT NULL);
我还假设Table2
中的所有数字都是3位数字。
您可以使用INSTR
(字符串内)功能:
INSTR
要搜索的值是所有3位数字(或3个字符的字符串,无论如何)。如果要处理可变长度数据,并且 SELECT t2.number
FROM Table1 AS t1
JOIN Table2 AS t2 ON INSTR(t1.line, " " || t2.number || " ") != 0
中的类型不是可变长度类型,则需要将Table2
应用于TRIM
。避免级联操作会很好。如果您可以修改t2.number
,以便将Table2
和数字插入前导空格(三位数自动出现在尾部,那么可以使用
number CHAR(5) NOT ULL
如果数字是可变长度,则将不起作用-串联是必要的,在比较中使用它们之前,您需要修剪值:
SELECT TRIM(t2.number)
FROM Table1 AS t1
JOIN Table2 AS t2 ON INSTR(t1.line, t2.number) != 0
如 SELECT t2.number
FROM Table1 AS t1
JOIN Table2 AS t2 ON INSTR(t1.line, " " || TRIM(t2.number) || " ") != 0
在answer中所指出的,您也可以使用Antonio J. Ortiz运算符代替LIKE
功能或INSTR
运算符。
table1:
MATCHES
table2:
line
------
"Insert nalog14: 8880888802981130 GERARD..."
...
number
------
"220"
"150"
"400"