Обрезать часть строки - PullRequest
0 голосов
/ 15 мая 2018

У меня есть таблица с длинным столбцом.Мне нужно взять только имя из столбца.

Это имя столбца:

QSTY-IOM-HFVNBJGYG | Mobile #: 9876541323 | CUSTOMER NAME: MNOP UNIPOUYTREA POIUY | INVOICE DATE:02/28/18 | EMP#: 101466 | EMPLOYEE NAME: ANGELINA CASIANO

Мне просто нужно выбрать имя клиента из этого столбца.Я попробовал Charindex, и он выдавал сообщение об ошибке

Недопустимый параметр длины, переданный в функцию LEFT или SUBSTRING.

вывод:

MNOP UNIPOUYTREA POIUY

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

С SQL-Serer-2016 + вы должны использовать STRING_SPLIT.

С более низкими версиями я бы использовал этот подход:

Совершенно прямая комбинация XQuery и T-SQL

DECLARE @string VARCHAR(1000)='QSTY-IOM-HFVNBJGYG | Mobile #: 9876541323 | CUSTOMER NAME: MNOP UNIPOUYTREA POIUY | INVOICE DATE:02/28/18 | EMP#: 101466 | EMPLOYEE NAME: ANGELINA CASIANO';

WITH Casted AS
(
    SELECT CAST('<x>' + REPLACE((SELECT @string AS [*] FOR XML PATH('')),' | ','</x><x>') + '</x>' AS XML)
          .query('/x[substring(text()[1],1,13)="CUSTOMER NAME"]')
          .value('(/x/text())[1]','varchar(1000)') AS TheFragment
)
SELECT LTRIM(RTRIM(SUBSTRING(TheFragment,CHARINDEX(':',TheFragment)+2,1000)))
FROM Casted;

CTE преобразует вашу строку в XML, что позволяет читать каждую часть отдельно. .query() вернет один фрагмент, начинающийся с "CUSTOMER NAME", а .value() извлекает (полный) текст из этого фрагмента. Остальное просто SUBSTRING ...

0 голосов
/ 15 мая 2018

Если формат соответствует, вы можете попробовать, как показано ниже:

declare @val varchar(max) = 'QSTY-IOM-HFVNBJGYG | Mobile #: 9876541323 | CUSTOMER NAME: MNOP UNIPOUYTREA POIUY | INVOICE DATE:02/28/18 | EMP#: 101466 | EMPLOYEE NAME: ANGELINA CASIANO'

select substring(@val, charindex('CUSTOMER NAME:', @val) + 15, charindex('INVOICE DATE:', @val) - (charindex('CUSTOMER NAME:', @val) + 18))
0 голосов
/ 15 мая 2018

Вот способ, который ищет CUSTOMER NAME:

with params as (
      select ' CUSTOMER NAME: ' as custname
     )
select t.*,
       (case when t.col like '%' + custname + '%'
             then s2.s2 
        end) as customer_name
from params cross join
     t outer apply
     (select substring(t.col, charindex(custname, col + custname), len(col))as s1
     ) s1 outer apply
     (select stuff(left(s1.s1, charindex('|', s1.s1 + '|') - 2),
                   1, len(custname) + 1, ''
                  ) as s2
     ) s2;

Это должно работать, если customer_name находится в конце строки, независимо от порядка значений и даже если 'CUSTOMER NAME' вообще отсутствует в строке.

Конечно, если вы используете SQL Server 2016, тогда лучше использовать решение, использующее split_string().

0 голосов
/ 15 мая 2018

Поскольку вы используете SQL Server 2016, вы можете использовать встроенный метод STRING_SPLIT для преобразования вашей строки в таблицу.Затем все, что вам нужно сделать, это выбрать значение из таблицы, которая начинается с CUSTOMER NAME:, например:

DECLARE @s varchar(300) = 'QSTY-IOM-HFVNBJGYG | Mobile #: 9876541323 | CUSTOMER NAME: MNOP UNIPOUYTREA POIUY | INVOICE DATE:02/28/18 | EMP#: 101466 | EMPLOYEE NAME: ANGELINA CASIANO'

SELECT [value]
FROM STRING_SPLIT(@s, '|')
WHERE LTRIM([value]) LIKE 'CUSTOMER NAME:%'

Однако вы должны прочитать Сохранение списка с разделителями в столбце базы данныхдействительно так плохо? и нормализуйте свою базу данных, если это возможно.

...