2016-10-05 3 views
0

열에 4 개의 값을 Shift (추가)하고 싶습니다. 기본적으로 각 문자 ASCII 번호에 4를 더합니다. F.e :MS SQL에서 ascii 코드를 변경하십시오.

'ABCD' -> 'EFGH' 
'1234' -> '5678' 
'A1B2' -> 'E5F6' 

나는

SELECT CONVERT(VARBINARY(MAX), CONVERT(VARCHAR(MAX), Column1)) 
FROM Table1 

,이 같은 16 진수 코드로 모든 문자를 변경할 수 있지만 각 문자에 대한 4를 추가하는 방법을 모르겠어요.

쿼리가 가능합니까?

샘플 :

Z ->^
z -> ~ 
W -> [ 
9 -> = 

뭔가 CHAR(ASCII('z') + 4) = ~ 같은

+1

는 Z''어떻게됩니까? –

+0

당신은 문자 단위로 문자열을 통과하는 함수를 작성할 수 있습니다. 그리고 말하자면, 그 문자의 ascii 값을 4 씩 증가시킬 수 있습니다 만, SQL에서 이것을 수행하는 쉬운 방법은 없다고 생각합니다. – ZLK

+0

'W', 'X', 'Y', 'Z', '6', '7', '8', '9'의 장면은 무엇입니까? – Wanderer

답변

1
이 점은 함수 (UDF)

샘플을 사용하여 수행 할 수 있습니다

create function Charchange(@inputstring varchar(max)) 
returns varchar(max) 
AS 
BEGIN 
    DECLARE @i int, 
      @Results varchar(max) 
    SET @Results='' 
    SET @i = 1 
    WHILE @i <= DATALENGTH(@inputstring) 
    BEGIN 
      SET @Results = @Results + char(ASCII(SUBSTRING(@inputstring,@i,1))+4) 

     SET @[email protected] + 1 
    END 
RETURN @Results 
END 


select dbo.Charchange('abc123xyz') 

or 

    select dbo.Charchange(coulmn1) FROM Table1 
0

내가 재귀 CTE로하고위한 솔루션을 가지고 XML 경로 :

,
DECLARE @n int = 4 --Add 4 for each ASCII 
--Here I simulate your table, hope you have ids in it 
-- because I used to join it with values 
;WITH YourTable AS (
SELECT CAST(SomeString as nvarchar(max)) as SomeString 
FROM (VALUES ('ABCD'),('1234'),('A1B2'),('WXYZ') 
) as t(SomeString) 
), cte AS (--Here we replace chars 
SELECT CHAR(ASCII(SUBSTRING(SomeString,1,1))[email protected]) as d, 
     1 as [level], 
     LEN(SomeString) as l, 
     SomeString as OrigString 
FROM YourTable 
UNION ALL 
SELECT CHAR(ASCII(SUBSTRING(OrigString,[level]+1,1))[email protected]), 
     [level]+1, 
     l, 
     OrigString 
FROM cte 
WHERE l >= [level]+1) 
--Final output 
SELECT DISTINCT c.OrigString, 
       (SELECT d+'' 
       FROM cte 
       WHERE c.OrigString = OrigString 
       FOR XML PATH('') 
       ) as NewString 
FROM cte c 
OPTION (MAXRECURSION 0) 

출력 :

OrigString NewString 
1234  5678 
A1B2  E5F6 
ABCD  EFGH 
WXYZ  [\]^ 

EDIT VARBINARY (MAX)와

해결 변환 :

DECLARE @x xml, 
     @n int = 4 --Add 4 for each ASCII 
--Here I simulate your table, hope you have ids in it 
-- because I used to join it with values 
;WITH YourTable AS (
SELECT CAST(SomeString as nvarchar(max)) as SomeString 
FROM (VALUES ('ABCD'),('1234'),('A1B2'),('WXYZ') 
) as t(SomeString) 
) 
SELECT @x = (
    SELECT CAST('<row str="'+SomeString+'"><p>'+REPLACE(REPLACE(CONVERT(nvarchar(max),CONVERT(VARBINARY(MAX),SomeString),1),'0x',''),'00','</p><p>')+'</p></row>' as xml) 
    FROM YourTable 
    FOR XML PATH('') 
) 
;WITH cte AS(
SELECT t.c.value('../@str','nvarchar(max)') as OrigString, 
     CHAR(CAST(CONVERT(VARBINARY(2),'0x'+t.c.value('.','nvarchar(2)'),1) as int)[email protected]) as NewValues 
FROM @x.nodes('/row/p') as t(c) 
) 

SELECT DISTINCT 
       c.OrigString, 
       LEFT((
       SELECT NewValues +'' 
       FROM cte 
       WHERE OrigString = c.OrigString 
       FOR XML PATH('') 
       ),LEN(c.OrigString)) as NewString 
FROM cte c 

동일한 출력.

1
-- Sample table 
declare @T table(S varchar(10)); 

-- Sample data 
insert into @T(S) values ('ABCD'),('1234'),('A1B2'),('WXYZ'); 

-- Split the string using a numbers table and 
-- Rebuild the string with for xml path 
select T.S, 
     (
     select char(ascii(substring(T.S, N.N, 1)) + 4) 
     from dbo.Number as N 
     where N.N >= 1 and 
      N.N <= len(T.S) 
     order by N.N 
     for xml path(''), type 
     ).value('text()[1]', 'varchar(10)') 
from @T as T; 

SQL, Auxiliary table of numbers

Concatenate many rows into a single text string

+0

귀하의 솔루션은 XML 변환없이보다 효율적인 방법으로 내 대답을 다시 작성하도록했습니다. – gofr1

관련 문제