Как получить строку, равную каждой первой букве слов в предложении IN SQL - PullRequest
0 голосов
/ 07 января 2019

У меня есть слова, разделенные пробелом в столбце, как apple orange banana Мне нужны первые буквы, в результате будет что-то вроде:

aob

Ответы [ 4 ]

0 голосов
/ 07 января 2019

Думаю, самое короткое будет:

Вот макет-таблица с двумя строками для имитации вашей проблемы:

DECLARE @mockup TABLE(ID INT IDENTITY,YourWords VARCHAR(100));
INSERT INTO @mockup VALUES('apple orange banana'),('one two three');

- это запрос:

SELECT m.ID
      ,REPLACE(Casted.query('for $w in /x return substring($w,1,1)').value('.','varchar(max)'),' ','')
FROM @mockup m
CROSS APPLY(SELECT CAST('<x>' + REPLACE(m.YourWords,' ','</x><x>') + '</x>' AS XML)) A(Casted);

Идея:
Строка apple orange banana преобразуется в <x>apple</x><x>orange</x><x>banana</x> и преобразуется в XML, что позволяет использовать XQuery.
Теперь мы используем .query() в XML с простым оператором FLWOR. Он говорит двигателю: пробегать каждое значение /x и возвращать только первую букву . Вызов value() для этого с . как XPath вернет значения в одном .
Нам нужен окончательный REPLACE(), чтобы избавиться от пробелов, который в противном случае выглядел бы как a o b вместо aob.

0 голосов
/ 07 января 2019

Просто еще один вариант, использующий немного XML. Вы также можете использовать ParseName () при условии, что вы перехватываете любые точки в строке.

* ** 1003 тысяча два * Пример
Declare @YourTable table(ID int,LastName varchar(50),FirstName varchar(50))
Insert Into @YourTable values
(1,'Waston','Mary Jane')

Select A.ID
      ,NewValue = upper(
                      concat(
                            xmlData.value('/x[1]','varchar(1)')
                           ,xmlData.value('/x[2]','varchar(1)')
                           ,xmlData.value('/x[3]','varchar(1)')
                           ,xmlData.value('/x[4]','varchar(1)')
                           ,'.'
                           ,LastName
                       )
                   )
 From  @YourTable A
 Cross Apply ( values (convert(xml,'<x>' + replace(A.FirstName,' ','</x><x>')+'</x>' )) ) B(xmlData)

Returns

ID  NewValue
1   MJ.WASTON

РЕДАКТИРОВАТЬ - Добавлена ​​опция ParseName ()

Select A.ID
      ,NewValue = upper(concat(Pos1,Pos2,Pos3,Pos4,'.',LastName))
 From  @YourTable A
 Cross Apply (
                Select Pos1 = left(parsename(tStr,4),1)
                      ,Pos2 = left(parsename(tStr,3),1)
                      ,Pos3 = left(parsename(tStr,2),1)
                      ,Pos4 = left(parsename(tStr,1),1)
                 From  ( values(replace(FirstName,' ','.'))) B1(tStr)
             ) B
0 голосов
/ 07 января 2019

Если вы объявляете функцию REGEX в вашей БД (не встроенную в SQL SERVER).

Использование regexp_replace

select regexp_replace('apple orange banana','(\\w)(\\w* ?)','$1')

возвращение

aob
0 голосов
/ 07 января 2019

Сначала разделите ваш текст. Я рекомендую некоторые функции:

CREATE FUNCTION Split(@text nvarchar(MAX),@separator nvarchar(MAX))
RETURNS TABLE AS RETURN
WITH Indexed AS
(
    SELECT 1 N, CAST(1 AS bigint) S, CHARINDEX(@separator, @text, 1) E WHERE @text IS NOT NULL
    UNION ALL
    SELECT N+1, E+DATALENGTH(@separator)/2, CHARINDEX(@separator, @text, E+DATALENGTH(@separator)/2) FROM Indexed WHERE E>S
), Token AS
(
    SELECT N, SUBSTRING(@text, S, CASE WHEN E=0 THEN DATALENGTH(@text)/2 ELSE E-S END) T FROM Indexed
)
SELECT * FROM Token

Если вы используете SQL 2016 и новее, используйте STRING_SPLIT .

Затем вы можете выбрать первый символ каждого слова и присоединиться. Смотрите следующий пример:

DECLARE @Sample TABLE (T nvarchar(100));
INSERT @Sample VALUES (N'apple orange banana'),(N'dog cat');

SELECT (SELECT SUBSTRING(T,1,1) [*] FROM Split(T,N' ') FOR XML PATH(''))
FROM @Sample

Результат:

(no column name)
------
aob
dc
...