如果字符串包含来自另一列的任何值,return 该值 - SQL Informix
If string contains any value from another column, return that value - SQL Informix
我有一列有很长的字符串,某处(不是在精确位置)是我要提取的 3 位数字。字符串的那部分,可以是另一列 table 的已定义列表中的任何内容。
因此,如果字符串的一部分包含列中定义的值,return 该值。我如何使用 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
...
所以我的字符串在字符串的 'This is some random text' 部分之后包含值“130”,并且该值也在引用列中。
我想要的输出只是从字符串中提取该值。
130
同样有问题的是,我想提取的部分字符串也可能出现在字符串的其他地方,正如您在开头看到的
8880888802981130,但这是偶然发生的。我唯一能识别的模式是所需的输出总是在前后用空白 space 分隔。
希望对您有所帮助。
表1:
line
------
"Insert nalog14: 8880888802981130 GERARD..."
表2:
number
------
"220"
"150"
"400"
...
select number
from table1,table2
where line like "%"||trim(number)||"%"
我假设有一个 table Table1
具有:
CREATE TABLE Table1 ( …, line LVARCHAR, … );
CREATE TABLE Table2 (number CHAR(3) NOT NULL);
我还假设 Table2
中的所有数字都是 3 位数。
您可以使用 INSTR
(字符串内)函数:
SELECT t2.number
FROM Table1 AS t1
JOIN Table2 AS t2 ON INSTR(t1.line, " " || t2.number || " ") != 0
其中要搜索的值都是 3 位数字(或至少是 3 个字符的字符串)。如果你处理的是变长数据,而Table2
中的类型不是变长类型,那么你需要应用TRIM
到t2.number
。最好避免串联操作。如果您可以修改 Table2
以便 number CHAR(5) NOT ULL
和数字插入前导 space (三位数字后自动有尾随 space),那么你可以使用
SELECT TRIM(t2.number)
FROM Table1 AS t1
JOIN Table2 AS t2 ON INSTR(t1.line, t2.number) != 0
如果数字是可变长度的,这将不起作用 — 连接是必要的,您需要 trim 在比较中使用它们之前的值:
SELECT t2.number
FROM Table1 AS t1
JOIN Table2 AS t2 ON INSTR(t1.line, " " || TRIM(t2.number) || " ") != 0
如 by Antonio J. Ortiz 中所述,您还可以使用 LIKE
运算符代替 INSTR
函数或 MATCHES
运算符。
我有一列有很长的字符串,某处(不是在精确位置)是我要提取的 3 位数字。字符串的那部分,可以是另一列 table 的已定义列表中的任何内容。
因此,如果字符串的一部分包含列中定义的值,return 该值。我如何使用 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
...
所以我的字符串在字符串的 'This is some random text' 部分之后包含值“130”,并且该值也在引用列中。
我想要的输出只是从字符串中提取该值。
130
同样有问题的是,我想提取的部分字符串也可能出现在字符串的其他地方,正如您在开头看到的 8880888802981130,但这是偶然发生的。我唯一能识别的模式是所需的输出总是在前后用空白 space 分隔。
希望对您有所帮助。
表1:
line
------
"Insert nalog14: 8880888802981130 GERARD..."
表2:
number
------
"220"
"150"
"400"
...
select number
from table1,table2
where line like "%"||trim(number)||"%"
我假设有一个 table Table1
具有:
CREATE TABLE Table1 ( …, line LVARCHAR, … );
CREATE TABLE Table2 (number CHAR(3) NOT NULL);
我还假设 Table2
中的所有数字都是 3 位数。
您可以使用 INSTR
(字符串内)函数:
SELECT t2.number
FROM Table1 AS t1
JOIN Table2 AS t2 ON INSTR(t1.line, " " || t2.number || " ") != 0
其中要搜索的值都是 3 位数字(或至少是 3 个字符的字符串)。如果你处理的是变长数据,而Table2
中的类型不是变长类型,那么你需要应用TRIM
到t2.number
。最好避免串联操作。如果您可以修改 Table2
以便 number CHAR(5) NOT ULL
和数字插入前导 space (三位数字后自动有尾随 space),那么你可以使用
SELECT TRIM(t2.number)
FROM Table1 AS t1
JOIN Table2 AS t2 ON INSTR(t1.line, t2.number) != 0
如果数字是可变长度的,这将不起作用 — 连接是必要的,您需要 trim 在比较中使用它们之前的值:
SELECT t2.number
FROM Table1 AS t1
JOIN Table2 AS t2 ON INSTR(t1.line, " " || TRIM(t2.number) || " ") != 0
如 LIKE
运算符代替 INSTR
函数或 MATCHES
运算符。