аналог функции stuff() из Ms SQL?

лось педальный
Дата: 21.11.2008 10:06:45
аналог функции stuff() из Ms SQL? select stuff(stuff(p.expr,1,1,''),5,1,'') as EXPPNR from persons p
Добрый Э - Эх
Дата: 21.11.2008 10:13:40
Прямого аналога нету. Нужно делать на суперпозиции нескольких строковых функций.
лось педальный
Дата: 21.11.2008 10:17:44
так всё плохо? ладно, будем делать
Добрый Э - Эх
Дата: 21.11.2008 10:24:36
лось педальный
так всё плохо? ладно, будем делать
А че плохого? В чем смысл на каждый пчих городить функцию? Их же потом ещё и помнить все нужно.
А так, запомнил себе SUBSTR и конкатенаци. - и всё:

SELECT 'STUFF(expr1, start_pos, len, expr2)' as "MS SQL Server",
       'substr(expr1,1,start_pos - 1)||expr2 ||substr(expr1,start_pos + len )' as "Oracle",
       substr(expr1,1,start_pos - 1)||expr2 ||substr(expr1,start_pos + len ) as result
  from (select 'abcdef' as expr1,
               'ijklmn' as expr2,
               2 as start_pos,
               3 as len
          from dual 
       )
Добрый Э - Эх
Дата: 21.11.2008 10:28:22
И ещё небольшой совет на будущее: если ищешь в одной системе аналога какой-то функции из другой системы, то не забывай указывать, что должна делать эта функция. Этим самым ты увеличишь шансы на быстрый и правильный ответ. Ведь не все же люди работают с двумя системами сразу...
andreymx
Дата: 21.11.2008 10:41:29
Даже в клиппере была в 1990-ом
автор
STUFF()
Удаляет или вставляет символы в строке.
──────────────────────────────────────────────────────────────────────────────

Синтаксис

STUFF(<строка символов>, <начало замены>, <к-во удаляемых символов>, <вставляемая подстрока>)
--> новая строка символов

Аргументы

<строка символов> - символьная строка, в которую вставляются или из которой удаляются символы.
<начало замены> - начальная позиция в строке, с которой происходит вставка (удаление).
<к-во удаляемых символов> - число символов, подлежащих удалению.
<вставляемая подстрока> - вставляемая строка.

Возвращаемое значение

STUFF() возвращает копию аргумента <строка символов> с удаленными символами и вставленной строкой, значение которой задано аргументом <вставляемая подстрока>.

Описание

STUFF() является функцией обработки символьных строк, удаляющей символы, количество которых задано в аргументе <к-во удаляемых символов>, из аргумента <строка символов>, начиная с позиции, заданной аргументом <начало замены>. Затем она вставляет значение
аргумента <вставляемая подстрока> в полученную строку, начиная с символа, номер которого определен в аргументе <начало замены>, и формирует возвращаемую строку. При этом STUFF() может выполнять шесть следующих операций:

■ Вставка. Если значение аргумента <к-во удаляемых символов> равно нулю, из аргумента <строка символов> символы не удаляются. Значение аргумента <вставляемая подстрока> вставляется, начиная с позиции, заданной аргументом <начало замены>, после чего строка
возвращается. Например:

STUFF("My dog has fleas" , 12, 0, "no")

возвратит: "My dog has no fleas".

■ Замена. Если значение аргумента <вставляемая подстрока> имеет ту же длину, что и значение аргумента <к-во удаляемых символов>, значение аргумента <вставляемая строка> заменяет символы, начиная с позиции, заданной аргументом <начало замены>. Удаляется то же число символов, что и вставляется, и полученная строка имеет такую же длину, что и первоначальная. Например:

STUFF("My dog has fleas", 12, 5, "bones")
возвращает: "My dog has bones".

■ Удаление. Если значение аргумента <вставляемая подстрока> является строкой с нулевой длиной (""), из строки, заданной аргументом <строка символов>, удаляется число символов, заданное аргументом <к-во удаляемых символов>, и строка возвращается без каких-либо добавленных символов. Например:

STUFF("My dog has fleas", 1, 3, "")
возвратит: "dog has fleas".

■ Замена и вставка. Если значение аргумента <вставляемая подстрока> больше, чем значение аргумента <к-во удаляемых символов>, все символы, начиная с позиции, установленной аргументом <начало замены>, в соответствии со значением аргумента <к-во удаляемых символов>, удаляются, а затем значение аргумента <вставляемая
подстрока> вставляется в строку. Поскольку вставляется больше символов, чем удаляется, полученная строка всегда длиннее первоначальной. Например:

STUFF("My dog has fleas", 8, 3, "does not have")
возвратит: "My dog does not have fleas".

■ Замена и удаление. Если длина аргумента <вставляемая подстрока> меньше, чем значение аргумента <к-во удаляемых символов>,лишние символы будут удалены, а затем произойдет вставка. Результирующая строка при этом будет короче исходной. Например:

STUFF ("My dog has fleas", 8, 3, "is")
возвратит: "My dog is fleas".

■ Замена и удаление оставшихся символов. Если значение аргумента <к-во удаляемых символов> больше или равно числу оставшихся символов, начиная с позиции ,заданной аргументом <начало замены>, аргумента <строка символов>, все эти оставшиеся символы удаляются перед вставкой значения аргумента <вставляемая подстрока>.
Например:

STUFF("My dog has fleas", 8, 10, "is")

возвратит "My dog is".

Примеры

■ Этот пример демонстрирует шесть основных операций STUFF():

// Вставка
? STUFF("ABCDEF", 2, 0, "xyz") // Результат: AxyzBCDEF
//
// Замена
? STUFF("ABCDEF", 2, 3, "xyz") // Результат: AxyzEF
//
// Удаление
? STUFF("ABCDEF", 2, 2, "") // Результат: ADEF
//
// Замена со вставкой
? STUFF("ABCDEF", 2, 1, "xyz") // Результат: AxyzCDEF
//
// Замена с удалением
? STUFF("ABCDEF", 2, 4, "xyz") // Результат: AxyzF
//
// Замена с удалением оставшихся символов
? STUFF("ABCDEF", 2, 10, "xyz") // Результат: Axyz

Файлы: Библиотека EXTEND.LIB, исходный текст - EXAMPLEC.C.

лось педальный
Дата: 21.11.2008 10:45:19
в Oracle на самом деле много чего такого, что приходится делать сложнее и требует больше кода чем в MS SQL.... Естественно и MS SQL не идеален. Сейчас не о том...
Просто задача перевести много хранимых процедур из MS SQL в Oracle и такие мелочи убивают.
Не написал что делает, потому что здесь сидят мегамонстры, которые итак всё знают... Как вообщем то и Вам, им ясно что функция заменяет символы на определённых позициях..
Вячеслав Любомудров
Дата: 21.11.2008 10:48:17
"Мегамонстры" в првую очередь поинтересуются, не как ты пытаешься это сделать, а какой результат получить
Как правило, они правы...
Elic
Дата: 21.11.2008 10:49:00
лось педальный
Просто задача перевести много хранимых процедур из MS SQL в Oracle
Что мешает проэмулировать? ;)
create function stuff ...
Добрый Э - Эх
Дата: 21.11.2008 10:49:30
лось педальный
Просто задача перевести много хранимых процедур из MS SQL в Oracle и такие мелочи убивают.
Ну, тогда проще всего будет написать свою функцию с названием STUFF (благо, в Oracle это слово не является зарезервированным). Тогда остальной код, где она встречается, переделывать не придется :)