Данные строки разделения SQL, разделенные пробелами - PullRequest
0 голосов
/ 01 марта 2019

Я ищу запрос для поиска n-го значения в списке.Разделитель является чем-то большим или равным 2 пробелам.(это может быть 3 или 5 пробелов).Попытка избежать скалярных значений функций, так как производительность может быть ниже.Предложения могут содержать любое количество слов, от 5 до 20.

create table dbo.TestWrite (TestWriteId int primary key identity(1,1), TextRow varchar(255))
insert into dbo.TestWrite (TextRow)

I    am    writing       SQL  Code.                          -- Row 1: Column 1: I ,    Column 2: am,       Column 3: writing...
SQL   keywords    include       join,   except,      where.  -- Row 2: Column 1: SQL,   Column 2: keywords, Column 3: include...

Хотелось бы в отдельных строках со столбцами, см. Ожидаемый результат - комментарии выше, используя оператор выбора.

Это может быть одно решение, которое пытается использовать. Используя T-SQL, вернуть n-й элемент с разделителями из строки

DECLARE @dlmt NVARCHAR(10)=N' ';
DECLARE @pos INT = 2;
SELECT CAST(N'<x>' + REPLACE(@input,@dlmt,N'</x><x>') + N'</x>' AS XML).value('/x[sql:variable("@pos")][1]','nvarchar(max)')

1 Ответ

0 голосов
/ 01 марта 2019

Ваша проблема в том, что разбиение строки пробелами приводит к множеству пустых элементов.Выбор 2-го фрагмента имеет высокий шанс попасть в такой пустой.

Существует два подхода:

  1. Удалите все пробелы, чтобы вернуть строкина один пробел в качестве разделителя.Затем используйте подход, который вы нашли в другом вопросе.
  2. Используйте XQuery, чтобы вернуть только элементы с узлом text().

Попробуйте это:

DECLARE @TestWrite TABLE(TestWriteId int primary key identity(1,1), TextRow varchar(255))
insert into @TestWrite (TextRow) values
 ('I    am    writing       SQL  Code.')                           -- Row 1: Column 1: I ,    Column 2: am,       Column 3: writing...
,('SQL   keywords    include       join,   except,      where.');  -- Row 2: Column 1: SQL,   Column 2: keywords, Column 3: include...

ad 1.: используйте любые два символа, которые не будут появляться в ваших строках

SELECT REPLACE(REPLACE(REPLACE(TextRow,' ','<>'),'><',''),'<>',' ')
FROM @TestWrite;

ad 2.

DECLARE @dlmt NVARCHAR(10)=N' ';
DECLARE @pos INT = 2;

SELECT CAST(N'<x>' + REPLACE(t.TextRow,@dlmt,N'</x><x>') + N'</x>' AS XML)
      .query('/x[text()]')  --<-- Here's the magic
      .value('/x[sql:variable("@pos")][1]','nvarchar(max)')
FROM @TestWrite t
...