Как использовать сплит в SQL Server? - PullRequest
2 голосов
/ 17 мая 2019

Я хочу разбить первое слово в запросе на обновление.

- НАЗВАНИЕ: «Visual Studio»

UPDATE SET TITLE = TITLE.Split(' ')[0]

- РЕЗУЛЬТАТ: "Визуальный"

Ответы [ 3 ]

6 голосов
/ 17 мая 2019

Насколько я знаю, в SQL Server нет функции SPLIT. Функция - это a STRING_SPLIT в версии 2016 или более поздней, но это не обязательно будет работать здесь. Причина, по которой он может работать не так, как ожидалось, заключается в том, что он генерирует таблицу в качестве выходных данных, содержащую отдельные термины, которые не упорядочены.

Если вы хотите обновить поле TITLE, чтобы сохранить только первое слово, рассмотрите возможность использования функций базовой строки:

UPDATE yourTable
SET TITLE = SUBSTRING(TITLE, 1, CHARINDEX(' ', TITLE) - 1)
WHERE CHARINDEX(' ', TITLE) > 0;

Приведенная выше логика обрабатывает случай, когда в данном заголовке могут отсутствовать пробелы, т. Е. Он состоит только из одного слова. В этом случае обновление просто пропустит эту запись.

0 голосов
/ 17 мая 2019

Если вы используете SQL Server 2016+, другой возможный способ разбить строку на подстроки и получить подстроку по позиции - это использовать OPENJSON () (это не слишком сложно, даже если вы незнаком с JSON).

Сначала преобразуйте входной текст в действительный массив JSON, используя REPLACE() и STRING_ESCAPE() (например, 'Visual studio' в '["Visual", "Studio"]').После этого используйте OPENJSON() со схемой по умолчанию, чтобы извлечь этот массив JSON в виде таблицы, в которой есть столбцы key, value и type.Столбец key содержит индекс элемента в указанном массиве, поэтому вы можете получить каждый элемент по индексу.

Ввод:

CREATE TABLE #Data (
   [Text] nvarchar(100)
)
INSERT INTO #Data
   ([Text])
VALUES
   (N'Visu"al Studio'),
   (N'Visual Studio'),
   (N'Visual1 Studio'),
   (N'Visual2 Studio'),
   (N'Visual3 Studio'),
   (N'Visual[ Studio')

T-SQL:

UPDATE #Data
SET [Text] = (
   SELECT [value]
   FROM OPENJSON(CONCAT(N'["', REPLACE(STRING_ESCAPE([Text], 'json'), N' ', N'","'), '"]'))
   WHERE [key] = 0
   -- or get other substring by index: WHERE [key] = 1
)   

Выход:

SELECT [Text] 
FROM #Data

-------
Text
-------
Visu"al
Visual
Visual1
Visual2
Visual3
Visual[   
0 голосов
/ 17 мая 2019

В MS SQL Server, чтобы решить его, используйте STRING_SPLIT как там:

update t set 
  t.Title = a.First_Word
from Your_Table
outer apply (
  select top 1
    value as First_Word
  from t.TITLE.STRING_SPLIT(' ')
) as a

Или вы можете написать для этого некоторую встроенную функцию:

create function Get_FirstWord(@words varchar(max))
returns varchar(max) as
begin
  declare @First_word varchar(max);

  select top 1
    @First_word = value
  from @words.string_split(' ');

  return @First_word;
end;

А потом используйте это так:

update Your_Table set 
  Title = Get_First_Word(Title)    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...