Как получить только заглавные буквы от заданного значения - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть таблица, содержащая столбцы идентификатора, описания и кода.Мне нужно заполнить код столбца, используя описание столбца.Пример описания: «Расследования и меры по исправлению положения», поэтому мой код должен быть «IRM».

Примечание: есть ли такие слова, как "и / для / к / в", избегайте его

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Лично я бы сделал это с помощью встроенной табличной функции

В SQL Server 2017 или более поздней версии или в базе данных SQL Azure:

CREATE OR ALTER FUNCTION dbo.ExtractUpperCase(@s nvarchar(4000))
RETURNS TABLE
WITH SCHEMABINDING
AS
  RETURN 
  (
    WITH s(s) AS (SELECT 1 UNION ALL SELECT s+1 FROM s WHERE s < LEN(@s))
    SELECT TOP (3) value = STRING_AGG(SUBSTRING(@s,s,1),'') 
      WITHIN GROUP (ORDER BY s.s) 
      FROM s WHERE ASCII(SUBSTRING(@s,s,1)) BETWEEN 65 AND 90
  );
GO

В SQL Server 2016 или более ранней версии:

CREATE FUNCTION dbo.ExtractUpperCase(@s nvarchar(4000))
RETURNS TABLE
WITH SCHEMABINDING
AS
  RETURN 
  (
    WITH s(s) AS (SELECT 1 UNION ALL SELECT s+1 FROM s WHERE s < LEN(@s))
    SELECT value = (SELECT TOP (3) v = SUBSTRING(@s,s,1) FROM s
      WHERE ASCII(SUBSTRING(@s,s,1)) BETWEEN 65 AND 90 
      ORDER BY s.s FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(4000)')
  );
GO

В любом случае:

CREATE TABLE #x(id int, name nvarchar(4000));

INSERT #x(id, name) VALUES
  (1, N'Belo Horizonte Orange'),
  (2, N'São Paulo Lala'),
  (3, N'Ferraz de Vasconcelos Toranto');

SELECT id, f.value FROM #x AS x
  CROSS APPLY dbo.ExtractUpperCase(x.name) AS f
  ORDER BY id OPTION (MAXRECURSION 4000);

Результаты:

id     name
----   ----
1      BHO
2      SPL
3      SVT    

OPTION (MAXRECURSION 4000) необходим только в том случае, если длина ваших строк может превышать 100 символов.

0 голосов
/ 15 апреля 2019

Этот код может помочь вам ..

 declare @input as varchar(1000) -- Choose the appropriate size
  declare @output as varchar(1000) -- Choose the appropriate size

 select @input = 'Investigations and Remedial Measures', @output = ''

 declare @i int

select @i = 0

while @i < len(@input)
begin
select @i = @i + 1

select @output = @output +  case when  unicode(substring(@input, @i, 1))between 65 
   and 90 then substring(@input, @i, 1)  else '' end

end

SELECT @output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...