Если строка содержит какое-либо значение из другого столбца, вернуть это значение - SQL Informix - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть один столбец с очень длинной строкой, и где-то (не в точном месте) есть число 3 git, которое я хочу извлечь. Эта часть строки может быть чем-либо из определенного списка другой таблицы с одним столбцом.

Итак, если часть строки содержит определенное значение из столбца, вернуть это значение. Как я могу сделать это с 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

Также проблематично c в том, что часть строки, которую я хочу извлечь, также может присутствовать где-то еще в строке, как вы можете видеть в начале 8880888802981 130 , но это произошло случайно. Единственный шаблон, который я могу распознать, это то, что желаемый результат всегда отделяется пробелом до и после.

Надеюсь, это поможет.

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Я предполагаю, что есть таблица Table1 с:

CREATE TABLE Table1 ( …, line LVARCHAR, … );
CREATE TABLE Table2 (number CHAR(3) NOT NULL);

Я также предполагаю, что все числа в Table2 являются 3-х git числами.

Вы можете использовать функцию INSTR (in-string):

 SELECT t2.number
   FROM Table1 AS t1
   JOIN Table2 AS t2 ON INSTR(t1.line, " " || t2.number || " ") != 0

, где все искомые значения представляют собой 3-х git числа ( или 3-символьные строки, во всяком случае). Если вы имеете дело с данными переменной длины и тип Table2 не является типом переменной длины, то вам необходимо применить TRIM к t2.number. Было бы неплохо избежать операций конкатенации. Если вы можете изменить Table2 так, чтобы number CHAR(5) NOT ULL и числа вставлялись с начальным пробелом (после трех чисел git автоматически будет завершающий пробел), тогда вы можете использовать

 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 by Antonio J. Ortiz , вы также можете использовать оператор LIKE вместо функции INSTR или оператор MATCHES.

1 голос
/ 13 февраля 2020

table1 :

line
------
"Insert nalog14: 8880888802981130 GERARD..."

table2 :

number
------
"220"
"150"
"400"

...

select number
from table1,table2
where line like "%"||trim(number)||"%"
...