【问题标题】:Extracting a string using SQL PATINDEX, substring of varying sizes使用 SQL PATINDEX 提取字符串,不同大小的子字符串
【发布时间】:2014-11-06 19:47:11
【问题描述】:

我正在尝试提取###x######x##,有时还有#x#。有时数字和 x 之间可能有一个空格。本质上,我可能会遇到像

这样的字符串
  • 720x60
  • 720x600
  • 720 x 60
  • 720_x_60
  • 1x1

我使用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

结果:

【问题讨论】:

  • @Max 当然。不过,我在 T-SQL 中需要这个......使用正则表达式和另一种语言超出了我的项目范围。

标签: sql regex sql-server-2012 substring


【解决方案1】:

如果您正在处理一对数值,但同时也在处理脏数据,并且缺乏正则表达式的功能,那么您可以在 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 example

首先,从表格中选择您的展示位置、“x”在展示位置中的位置以及您想要的其他列。通过派生表传递其他列。

接下来,将字符串拆分为左右。

在另外两个查询中处理左右,第一个从数字部分开始获取结果的右侧,然后在非数字部分结束的结果的左侧。

编辑:修复了输出,现在选择了两个数字。

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 2019-12-31
    • 2021-12-23
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多