使用SQL PATINDEX提取字符串,子字符串大小不同

凯尔

我试图提取###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

结果:

在此处输入图片说明

贾兹·科尔(Jaaz Cole)

如果您要处理一对数值,但也要处理脏数据,并且缺少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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server:请求在每次出现相同子字符串之后提取字符串

来自分类Dev

从列sql提取字符串?

来自分类Dev

使用Stringr提取字符串

来自分类Dev

使用Jsoup提取字符串

来自分类Dev

以特定字符开头的 SQL 提取字符串

来自分类Dev

如何使用子字符串和位置函数从句子中提取字符串?

来自分类Dev

使用开始字符串和结束字符串从长字符串中提取子字符串?

来自分类Dev

使用开始字符串和结束字符串从长字符串中提取子字符串?

来自分类Dev

Bigquery SQL提取字符串左侧的文本

来自分类Dev

MS-SQL-提取字符串的数字部分

来自分类Dev

创建提取字符串 sql 的新列

来自分类Dev

从SQL Server中的虚线字符串中提取字符串

来自分类Dev

使用pl sql提取子字符串

来自分类Dev

使用Perl从xml文件中提取字符串

来自分类Dev

tsql-使用SUBSTRING提取字符串

来自分类Dev

使用列表函数提取字符串的中间部分

来自分类Dev

使用sed提取字符串值

来自分类Dev

使用make从路径/目录提取字符串

来自分类Dev

使用str_detect提取字符串的值

来自分类Dev

使用`rm_between`函数提取字符串

来自分类Dev

使用Regex和Python提取字符串

来自分类Dev

Python-使用Beautifulsoup从网站提取字符串

来自分类Dev

如何使用jq从数组中提取字符串?

来自分类Dev

批量使用左右边界提取字符串

来自分类Dev

如何使用sed提取字符串

来自分类Dev

使用ruby regex提取字符串

来自分类Dev

使用R从文本中提取字符串

来自分类Dev

使用awk提取字符串的2个部分

来自分类Dev

使用sed提取字符串的最后部分