Смещение символа для заданной строки - PullRequest
1 голос
/ 12 февраля 2020

Предположим, у нас есть значение типа varchar, например 'Durge sh', и я хочу увеличить (Char +2) каждого символа, указанного в 'Durge sh'. Пример:

  • D -> F
  • U -> W
  • R -> T
  • G -> I
  • E -> G
  • S -> U
  • H -> J
  • Так что, если мы введем параметр 'Durge sh' тогда нам нужен вывод 'Fwtiguj'.

Как я могу реализовать это с помощью запроса SQL?

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Это будет ваша функция:

CREATE FUNCTION [dbo].[shifting](@Input varchar(100))  
RETURNS varchar(100)   
AS   
BEGIN  
   declare

    @i INT=0,
    @a varchar(100) =''

    while @i<LEN(@Input)
    BEGIN 

       SET @i = @i +1
       set @a = @a + char(ascii(substring(@Input,@i,1))+2)

   end
       RETURN @a
END

Вы называете это как:

select [dbo].[shifting]('Durgesh') as [a]

Вот демо

Вот новая функция, которая решит проблему YZ и yz:

CREATE FUNCTION [dbo].[shifting](@Input varchar(100))  
RETURNS varchar(100)   
AS   
BEGIN  
   declare

    @i INT=0,
    @a varchar(100) =''

    while @i<LEN(@Input)
    BEGIN 

       SET @i = @i +1
    if substring(@Input,@i,1) in ('y','Y') 
       if ascii(substring(@Input,@i,1)) = ascii('y') 
          set @a = @a + 'a'
       else
          set @a = @a + 'A'
    else
    if substring(@Input,@i,1) in ('z','Z') 
       if ascii(substring(@Input,@i,1)) = ascii('z') 
          set @a = @a + 'b'
       else
          set @a = @a + 'B'
    else
       set @a = @a + char(ascii(substring(@Input,@i,1))+2)
   end
       RETURN @a
END

Вот демонстрационная версия

1 голос
/ 12 февраля 2020

Вы можете сделать это довольно легко с помощью таблицы подсчета. Я держу один в моей базе данных. Вот код для моей таблицы. Самое большое преимущество, которое имеет здесь таблица подсчета, состоит в том, что нам не нужно делать никаких циклов !!!

create View [dbo].[cteTally] as

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally

Теперь, когда у нас есть таблица подсчета, мы можем использовать ее для сдвига вашего персонажа. Это будет работать практически с любой строкой (пока вы не достигнете верхнего конца значений ASCII).

declare @Val varchar(10) = 'Durgesh'

select stuff((
    select char(ASCII(substring(@Val, t.N, 1)) + 2)
    from cteTally t
    where t.N <= len(@Val)
    order by t.N
    FOR XML PATH('')), 1, 0, '')

- EDIT -

Вот новая версия, которая будет "переносить" символы возвращаются к началу.

declare @Val varchar(100) = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

select stuff((
    select case when (ASCII(substring(@Val, t.N, 1)) > 88 AND ASCII(substring(@Val, t.N, 1)) < 91) --Upper case
                    OR ASCII(substring(@Val, t.N, 1)) > 120 --lower case
                then char(ASCII(substring(@Val, t.N, 1)) - 24) else char(ASCII(substring(@Val, t.N, 1)) + 2) end
    from cteTally t
    where t.N <= len(@Val)
    order by t.N
    FOR XML PATH('')), 1, 0, '')
0 голосов
/ 13 февраля 2020

Используйте код ниже: -

declare @val varchar(10) = 'Durgesh'
DECLARE @i INT = 0
WHILE @i < LEN(@val)
BEGIN 
    PRINT( CHAR( ASCII(SUBSTRING(@val,@i,1)) +2  ) ) 
    SET @i =  @i + 1
End
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...