【发布时间】:2018-04-10 10:58:42
【问题描述】:
我目前已经设法从一些描述中提取出一个代码列表,所有这些描述的格式都应该类似,例如:
'%[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9 ]%'
(00000-0000)
'%[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%'
(0000-0000)
'%[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]%'
(00000-000)
'%[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]%'
(0000-000)
'%[0-9][0-9][0-9][0-9]-[0-9][0-9]%'
(0000-00)
我注意到我目前没有提取出格式为 00000000 的代码,我想知道如果有办法将它们重组为 00000-000,我是否要提取这些代码?
我目前使用的代码是基于 Larnu 昨天的建议,如果有人可以帮助解决这个字符串操作问题,将不胜感激,如果可能的话,我想将重组后的字符串与其他字符串一起放在正确的格式。
WITH VTE AS (
SELECT *
FROM [Remedies].[dbo].[ShortageCompany] V)
SELECT
V.[ShortageDetailID]
,V.[ShortageID]
,V.[Company]
,V.[CompanyID]
,V.[Presentation]
,V.[Availability]
,V.[Information]
,V.[Reason]
,V.[StandardReason],
CASE WHEN PI1.C > 0 THEN SUBSTRING(V.[Presentation],PI1.C, 10)
WHEN PI2.C > 0 THEN SUBSTRING(V.[Presentation],PI2.C, 9)
WHEN PI3.C > 0 THEN SUBSTRING(V.[Presentation],PI3.C, 9)
WHEN PI4.C > 0 THEN SUBSTRING(V.[Presentation],PI3.C, 8)
WHEN PI5.C > 0 THEN SUBSTRING(V.[Presentation],PI3.C, 7)
ELSE NULL
END AS N
FROM VTE V
CROSS APPLY (VALUES(PATINDEX('%[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%',V.[Presentation]))) PI1(C)
CROSS APPLY (VALUES(PATINDEX('%[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]%',V.[Presentation]))) PI2(C)
CROSS APPLY (VALUES(PATINDEX('%[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]%',V.[Presentation]))) PI3(C)
CROSS APPLY (VALUES(PATINDEX('%[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]%',V.[Presentation]))) PI4(C)
CROSS APPLY (VALUES(PATINDEX('%[0-9][0-9][0-9][0-9]-[0-9][0-9]%',V.[Presentation]))) PI5(C)
ORDER BY [ShortageDetailID]
【问题讨论】:
-
STUFF('00000000', 6, 0, '-')=00000-000. -
供OP参考:
STUFF(Transact-SQL)
标签: sql-server string data-manipulation