Intereting Posts
SQL: «Обратный» транспонировать таблицу Если существуют два одинаковых поля, добавьте другое обновление SQL Server: как получить все дочерние записи с учетом родительского идентификатора в собственной справочной таблице Используемые операторы SELECT имеют различное количество столбцов Как считать varchar в varchar с помощью TSQL Вставка Sql, если строка не существует Как моя структура данных? SQL возвращает n строк для значения строки Как вернуть строку только в том случае, если выполнено несколько условий Вставка и выбор java.time.LocalDate объектов в / из базы данных SQL, такой как H2 T-sql, тики, метка времени Как работать с одной цитатой в Word VBA SQL-запрос? SQL Join с использованием таблицы соединений из рельсов MySQL: ОШИБКА 1022 (23000): Не удается написать; дублирующий ключ в таблице '# sql-2b8_2' оптимизировать формирование идентификатора последовательности Hibernate

Как разделить строку, разделенную запятыми, внутри хранимой процедуры?

Как разбить строку, разделенную запятыми, на строки внутри процедуры хранения и вставить их в поле таблицы?

Использование Firebird 2.5

Вот пример того, как разбить строку и записать подстроки в таблицу:

create procedure SPLIT_STRING ( AINPUT varchar(8192)) as declare variable LASTPOS integer; declare variable NEXTPOS integer; declare variable TEMPSTR varchar(8192); begin AINPUT = :AINPUT || ','; LASTPOS = 1; NEXTPOS = position(',', :AINPUT, LASTPOS); while (:NEXTPOS > 1) do begin TEMPSTR = substring(:AINPUT from :LASTPOS for :NEXTPOS - :LASTPOS); insert into new_table("VALUE") values(:TEMPSTR); LASTPOS = :NEXTPOS + 1; NEXTPOS = position(',', :AINPUT, LASTPOS); end suspend; end 

Я публикую модифицированную версию Майкла, возможно, это будет полезно для кого-то.

Изменения следующие:

  1. SPLIT_STRING – выбираемая процедура.
  2. Пользовательский разделитель возможен.
  3. Он также анализирует случаи, когда разделитель является первым символом в P_STRING.
 set term ^ ; create procedure split_string ( p_string varchar(32000), p_splitter char(1) ) returns ( part varchar(32000) ) as declare variable lastpos integer; declare variable nextpos integer; begin p_string = :p_string || :p_splitter; lastpos = 1; nextpos = position(:p_splitter, :p_string, lastpos); if (lastpos = nextpos) then begin part = substring(:p_string from :lastpos for :nextpos - :lastpos); suspend; lastpos = :nextpos + 1; nextpos = position(:p_splitter, :p_string, lastpos); end while (:nextpos > 1) do begin part = substring(:p_string from :lastpos for :nextpos - :lastpos); lastpos = :nextpos + 1; nextpos = position(:p_splitter, :p_string, lastpos); suspend; end end^ set term ; ^ 

Используйте ПОЗИЦИЮ http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-position.html.

а также

SUSTRING http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-substring.html

функций в инструкции WHILE DO

Это выглядит хорошо, за исключением одного, в моем объявлении размера Varchar сервера Firebird до 32000 вызывают исключение «Превышение предела реализации», поэтому будьте осторожны. Я предлагаю вместо этого использовать BLOB SUB_TYPE TEXT 🙂

Аналогичное решение, которое я использую, опубликовано недавно Джири Синкурой http://blog.cincura.net/232347-tokenize-string-in-sql-firebird-syntax/

 recreate procedure Tokenize(input varchar(1024), token char(1)) returns (result varchar(255)) as declare newpos int; declare oldpos int; begin oldpos = 1; newpos = 1; while (1 = 1) do begin newpos = position(token, input, oldpos); if (newpos > 0) then begin result = substring(input from oldpos for newpos - oldpos); suspend; oldpos = newpos + 1; end else if (oldpos - 1 < char_length(input)) then begin result = substring(input from oldpos); suspend; break; end else begin break; end end end