我有一张表格,表格很长。我只需要从列中获取名称。
这是列名:
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
答案 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
。
对于较低版本,我会使用这种方法:
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
...
答案 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()
的解决方案会更好。