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

Откуда: Прага
Сообщений: 247
Добрый день!
Может кто-нибудь сталкивался с простеньким алгоритмом кодирования ASCII строк в SQL? Есть строка типа "AMPMC7080NTUZ/Y-K", как бы получить из нее строку сходную по длине и с возможностью декодирования? Необходимое условие -- отсутсвие спецсимволов типа скобок, точек и запятых. Т.е. при кодировании надо попадать в символы алфавита и тире-слеш.
Спасибо за идеи.
15 окт 09, 13:47    [7790960]     Ответить | Цитировать Сообщить модератору
 Re: Как закодировать строку  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Кольцевой сдвиг на один символ, A->B, B->C,... Z->A
-------------------------
There’s no silver bullet!
15 окт 09, 13:49    [7790990]     Ответить | Цитировать Сообщить модератору
 Re: Как закодировать строку  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
может я не очень понял, что вам нужно, но как вариант создать справочник в котором каждой букве и слеш тире присвоить номер. Далее в вашей строке заменяйте буквы на другие например по принципу код символа из справочника+сдвиг...

--------------------------------------------------------------
Дьявол кроется в деталях.
15 окт 09, 13:52    [7791016]     Ответить | Цитировать Сообщить модератору
 Re: Как закодировать строку  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Что значит "закодировать"?
Зашифровать, что ли?
Тогда имхо Вам в форум Программирование
15 окт 09, 13:53    [7791036]     Ответить | Цитировать Сообщить модератору
 Re: Как закодировать строку  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
вам нужно кодировать запрос?
15 окт 09, 13:55    [7791056]     Ответить | Цитировать Сообщить модератору
 Re: Как закодировать строку  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Нужно преобразовать строку произвольной длины в eshop типа "AMPMC7080NTUZ/Y-K" - это код продукта, присвоенный производителем. Средствами SQL нужно его максимально просто преобразовать к виду, когда он напоминает исходный код, но исходный можно восстановить. Ясно, что результат должен быть читаем человеком. Когда по телефону менеджеру говорят про звездочки и решетки у него едет крыша :)
15 окт 09, 13:59    [7791098]     Ответить | Цитировать Сообщить модератору
 Re: Как закодировать строку  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
автор
Кольцевой сдвиг на один символ, A->B, B->C,... Z->A

Мерси, идея отличная, я сдвигал назад(-1), но было лень смотреть по таблице и в итоге вылазили местами всякие скобки и прочее. Сейчас подработаю напильником (заглавные буквы A-Z это 65-90 позиции в таблице), а слэши и тире оставлю без изменения.
15 окт 09, 14:02    [7791133]     Ответить | Цитировать Сообщить модератору
 Re: Как закодировать строку  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
cavalero
получить из нее строку сходную по длине и с возможностью декодирования?
cavalero
максимально просто преобразовать к виду, когда он напоминает исходный код, но исходный можно восстановить
select reverse('AMPMC7080NTUZ/Y-K') as result

result
-----------------
K-Y/ZUTN0807CMPMA

(1 row(s) affected)
15 окт 09, 14:04    [7791146]     Ответить | Цитировать Сообщить модератору
 Re: Как закодировать строку  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Паганель
cavalero
получить из нее строку сходную по длине и с возможностью декодирования?
cavalero
максимально просто преобразовать к виду, когда он напоминает исходный код, но исходный можно восстановить
select reverse('AMPMC7080NTUZ/Y-K') as result

result
-----------------
K-Y/ZUTN0807CMPMA

(1 row(s) affected)


Нет, это слишком просто.

У меня в итоге вышло вот что: со смещением в 5

alter FUNCTION [dbo].[FN_EncodeSKU] 
(
	@string varchar(max) = ''
)
RETURNS varchar(max)
AS
BEGIN
	DECLARE @position int,@res varchar(max),@ascii int
	
	SET @position = 1
	SET @res=''
	
	WHILE @position <= DATALENGTH(@string)
	BEGIN
		set @ascii = ASCII(SUBSTRING(@string, @position, 1))
		if @ascii>=65 and @ascii<=90
		begin
			if @ascii>85
			begin
				set @ascii=@ascii-20
			end
			else
			begin
				set @ascii=@ascii+5
			end
		end
	
		SET	@res = @res + CHAR(@ascii) 
		SET @position = @position + 1
	END
	return @res
END
15 окт 09, 14:22    [7791305]     Ответить | Цитировать Сообщить модератору
 Re: Как закодировать строку  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
одним запросом

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

табличку смешения только сами задайте )))
15 окт 09, 15:00    [7791601]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить