Kyl*_*yle 5 regex sql substring sql-server-2012
我试图提取###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
Run Code Online (Sandbox Code Playgroud)
结果:

如果您正在处理一对数值,但同时也在处理脏数据,并且缺少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
Run Code Online (Sandbox Code Playgroud)
这是SQLFiddle示例。
首先,从表格中选择您的展示位置,“ x”在展示位置中的位置以及其他所需的列。将其他列向上传递给派生表。
接下来,将字符串拆分为“左”和“右”。
在另外两个查询中处理左右,第一个查询从数字部分开始获取结果的右边,然后在非数字部分结束结果的左边。
编辑:固定输出,两个数字现在都选中。