Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Работа со строками  [new]
on-user
Member

Откуда:
Сообщений: 52
Сущ-ет к примеру строка INDEX056 , нужно перебрать все буквы, и заменить D - на 5 , а X на 0.
Подскажите какой фукнкцией пользоваться при переборе STAFF?
21 окт 09, 07:32    [7815081]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
Я вас не понял, но вот пример как можно заменить…
SELECT REPLACE(REPLACE('INDEX056','D','5'),'X',0)

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
21 окт 09, 07:42    [7815087]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
on-user
Member

Откуда:
Сообщений: 52
Replace можно, но вариантов переборов слишком много, и строка может быть 255 символов.
Перебор я вывела в отдельную функцию.
Кто подскажет, может это можно сделать более проще ?
---------------
CREATE FUNCTION dbo.Convert_date
(@Simbol varchar(1))
RETURNS varchar(50) AS
BEGIN
-- Конвертирование буквенных символов в цифровые
declare
@Result varchar(50)
begin
if @Simbol = 'A '
set @Result = '21'
if @Simbol = 'M'
set @Result = '33'
if @Simbol in('P','X','W')
set @Result = 'Недопустимый символ'
end
RETURN(@Result)
END
---------------------------
declare
@AccOut char(20),
@AccCC char(2),
@AccConvert varchar(38),
@Smb varchar(1),
@AccNew varchar(35)

create table #vrem
(Smb varchar(50))
--select * from #vrem
set @AccConvert = 'AM45MM'
set @AccNew = ''
while LEN(@AccConvert) > 0
begin
set @Smb = rtrim(ltrim(substring(@AccConvert,1,1)))
set @AccNew = isnull(dbo.Convert_date(@Smb),@Smb) --функция возвращает конвертированные символы
set @AccConvert = STUFF(@AccConvert,1,1,'')
insert into #vrem select @AccNew
end

--курсор
declare @ADDsmb varchar(2),
@AccComplate varchar(38)
set @AccComplate = ''
-------
DECLARE ADDdate CURSOR FOR
select * from #vrem

OPEN ADDdate
FETCH NEXT FROM ADDdate INTO @ADDsmb
WHILE (@@fetch_status = 0)
BEGIN
set @AccComplate = @AccComplate +@ADDsmb

FETCH NEXT FROM ADDdate INTO @ADDsmb
END
CLOSE ADDdate
Deallocate ADDdate

print @AccComplate
drop table #vrem
21 окт 09, 08:27    [7815159]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
А задача какая ?
21 окт 09, 08:33    [7815177]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
Ужась, оформляйте свой код, что вы на самом деле хотите зделать?

IF OBJECT_ID (N'dbo.Convert_date', N'FN') IS NOT NULL
    DROP FUNCTION dbo.Convert_date

IF OBJECT_ID(N'tempdb..#vrem', N'U') IS NOT NULL 
    DROP TABLE #vrem
GO

CREATE FUNCTION dbo.Convert_date(@Simbol varchar(1))
	RETURNS varchar(50) AS
BEGIN
	-- Конвертирование буквенных символов в цифровые
	declare
	@Result varchar(50)
	begin
		if @Simbol = 'A'
			set @Result = '21'
		if @Simbol = 'M'
			set @Result = '33'
		if @Simbol in('P','X','W')
			set @Result = 'Недопустимый символ'
		end
		RETURN(@Result)
END

GO
---------------------------
declare
@AccOut char(20),
@AccCC char(2),
@AccConvert varchar(38),
@Smb varchar(1),
@AccNew varchar(35)

create table #vrem(Smb varchar(50))
--select * from #vrem
	
set @AccConvert = 'AM45MM'
set @AccNew = ''
while LEN(@AccConvert) > 0
begin
	set @Smb = rtrim(ltrim(substring(@AccConvert,1,1)))
	set @AccNew = isnull(dbo.Convert_date(@Smb),@Smb) --функция возвращает конвертированные символы
	set @AccConvert = STUFF(@AccConvert,1,1,'')
	insert into #vrem select @AccNew
end

--курсор 
declare @ADDsmb varchar(2),
@AccComplate varchar(38)
set @AccComplate = ''

-------
DECLARE ADDdate CURSOR FOR 
select * from #vrem

OPEN ADDdate
FETCH NEXT FROM ADDdate INTO @ADDsmb
WHILE (@@fetch_status = 0)
BEGIN
	set @AccComplate = @AccComplate +@ADDsmb

	FETCH NEXT FROM ADDdate INTO @ADDsmb
END
CLOSE ADDdate
Deallocate ADDdate

SELECT @AccComplate
drop table #vrem

Почему нельзя заменить на

SELECT REPLACE(REPLACE('AM45MM','A','21'),'M',33)

?

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
21 окт 09, 08:45    [7815200]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Предположим, есть таблица перекодировки (1) и таблица с последовательными числами (2), количество строк в которой не меньше максимальной длины строки.
Можно и без последовательных чисел, если строки нумеровать очень хочется.

Создаём запрос, в котором:
1. исходные строки с помощью джойна с таблицей (2) разбираются на отдельные символы
2. полученный набор данных джойним с таблицей (1) по символам из п. 1.
3. собираем строки обратно из символов набора данных п. 2., которые соответствуют исходным.

on-user, а версия сервера-то какая?
21 окт 09, 08:56    [7815233]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
on-user
Member

Откуда:
Сообщений: 52
Ken@t
А задача какая ?

сущ-ет строка..состоящая из букв лат.алф. и цифр (ex:MASD4565GJ), сущ-ет так же таблица кодировки букв лат.алф. к примеру M- 10 A - 11 и тд
Надо вставить за вместо букв цифиры из этой кодировки, соответственно.
21 окт 09, 12:09    [7816664]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
on-user
Member

Откуда:
Сообщений: 52
DENIS_CHEL
Почему нельзя заменить на

SELECT REPLACE(REPLACE('AM45MM','A','21'),'M',33)

?

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..


потому что строка это входящий параметр в проц-ре, она может быть по размеру до 255 символов, и что мне все буквы лат.алфавита описывать здесь с помощью REPLACE ?
считаю очень не удобным вариантом.
Ещё есть у Вас варианты ?
21 окт 09, 12:13    [7816694]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
on-user
Member

Откуда:
Сообщений: 52
iap
on-user, а версия сервера-то какая?

Ms sql 2000
21 окт 09, 12:14    [7816704]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
[quot on-userсимволов, и что мне все буквы лат.алфавита описывать здесь с помощью REPLACE ?
считаю очень не удобным вариантом.
Ещё есть у Вас варианты ?[/quot]

достаточно мозг включить
DECLARE @STRING varchar(30)
		,@RESULT varchar(30)
		,@ORIGINAL varchar(30)
		
SET @STRING = 'AMPMC7080NTUZ/Y-K'
SET @RESULT = ''
SET @ORIGINAL = ''

DECLARE @PERMUTATION TABLE 
(
  A int
  ,B int
)
insert @PERMUTATION (A,B)
SELECT 0,15 UNION ALL
SELECT 1,07 UNION ALL
SELECT 2,14 UNION ALL
SELECT 3,06 UNION ALL
SELECT 4,13 UNION ALL
SELECT 5,05 UNION ALL
SELECT 6,12 UNION ALL
SELECT 7,04 UNION ALL
SELECT 8,11 UNION ALL
SELECT 9,03 UNION ALL
SELECT 10,10 UNION ALL
SELECT 11,02 UNION ALL
SELECT 12,09 UNION ALL
SELECT 13,01 UNION ALL
SELECT 14,08 UNION ALL
SELECT 15,00 UNION ALL
SELECT 16,16 



SELECT   
 @RESULT=@RESULT+SUBSTRING(@STRING,V.number+1,1)
FROM master..spt_values V
 INNER JOIN @PERMUTATION P ON (P.A=V.number)
where type = 'p' and V.number < LEN(@STRING)
ORDER BY P.B

SELECT  
 @ORIGINAL=@ORIGINAL+SUBSTRING(@RESULT,V.number+1,1)
FROM master..spt_values V
 INNER JOIN @PERMUTATION P ON (P.B=V.number)
where type = 'p' and V.number < LEN(@STRING)
ORDER BY P.A

SELECT @STRING,@ORIGINAL, CASE  WHEN @STRING = @ORIGINAL THEN 'OK' ELSE 'BAD' END

PRINT @RESULT

21 окт 09, 12:15    [7816718]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
iap привел вам вариант решения, он чем-то не нравиться?

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
21 окт 09, 12:15    [7816724]     Ответить | Цитировать Сообщить модератору
 Re: Работа со строками  [new]
on-user
Member

Откуда:
Сообщений: 52
DENIS_CHEL,
нравится,спасибо ему.
21 окт 09, 12:42    [7816962]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить