修剪String的一部分

时间:2018-05-15 10:02:12

标签: sql sql-server tsql sql-server-2016

我有一张表格,表格很长。我只需要从列中获取名称。

这是列名:

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 :(得分:6)

由于您使用的是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:%'

但是,如果可能,您应该阅读Is storing a delimited list in a database column really that bad?并规范化您的数据库。

答案 1 :(得分:3)

使用SQL-Serer-2016 +,您应该使用STRING_SPLIT

对于较低版本,我会使用这种方法:

XQueryT-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 ...

答案 2 :(得分:2)

如果格式一致,您可以尝试如下:

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))

答案 3 :(得分:2)

这是一种查找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()的解决方案会更好。