我试图提取###x###
,###x##
有时#x#
。有时数字和x之间可能会有空格。本质上,我可能会遇到类似
我PATINDEX()
用来查找模式的第一次出现'%[0-9]%x%[0-9]%'
。到目前为止,一切都很好。然后,我使用它PATINDEX()
来查找非数字字符串的第一次出现。这就是我遇到的麻烦。我得到的结果如屏幕截图所示。代码也在下面。
SELECT *
,CASE WHEN StartInt > 0
THEN SUBSTRING(Placement, StartInt, SizeLength) ELSE NULL END AS PlacementSize
FROM
(SELECT Placement
--find the first occurrence of #*x*#
,PATINDEX('%[0-9]%x%[0-9]%',Placement) AS StartInt
--find the first non-digit after that
,PATINDEX(
'%[^0-9]%'
,RIGHT(
Placement + '_' --this underscore adds at least one non-digit to find
,LEN(Placement)
-
PATINDEX('%[0-9]%x%[0-9]%',Placement) - 5
)
) + 6 AS SizeLength
FROM [Staging].[Client].[A01_FY14_Reporting_staging]
WHERE [Date] > '2014-07-01') AS a
结果:
如果您要处理一对数值,但也要处理脏数据,并且缺少Regex的功能,则可以在TSQL中进行以下操作。
本质上,您似乎想将字符串在'x'处切成两半,然后缩减输出,直到只有数字值为止。使用一组派生表,这变得相对容易(并且不难阅读)
declare @placements table (Placement varchar(10))
insert into @placements values
('720x60'),
('720x600'),
('720 x 60'),
('720_x_60'),
('1x1')
SELECT LEFT(LeftOfX,PATINDEX('%[^0-9]%',LeftOfX) - 1) + 'x' + RIGHT(RightOfX, LEN(RightOfX) - PATINDEX('%[0-9]%', RightOfX) + 1)
FROM (
SELECT RIGHT(LeftOfX, LEN(LeftOfX) - PATINDEX('%[0-9]%', LeftOfX) + 1) AS LeftOfX, LEFT(RightOfX, LEN(RightOfX) - PATINDEX('%[0-9]%', REVERSE(RightOfX)) + 1) AS RightOfX
FROM (
SELECT LEFT(p.Placement,x) AS LeftOfX, RIGHT(p.Placement,LEN(p.Placement) - x + 1) AS RightOfX
FROM (
SELECT
p.Placement
, CHARINDEX('x',p.Placement) AS x
FROM @placements p
) p
) p
) p
这是SQLFiddle示例。
首先,从表格中选择展示位置,“ x”在展示位置中的位置以及其他所需的列。将其他列向上传递给派生表。
接下来,将字符串拆分为“左”和“右”。
在另外两个查询中处理左右,第一个查询从数字部分开始对结果的右边,然后在非数字部分结束结果的左边。
编辑:固定输出,两个数字现在都选中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句