gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:05:34 25 4
gpt4 key购买 nike

我正在尝试提取 ###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

    结果:

    enter image description here

    最佳答案

    如果您正在处理一对数值,但也在处理脏数据,并且缺乏 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 example .

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

    接下来,将字符串拆分为 Left 和 Right。

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

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

    关于sql - 使用 SQL PATINDEX 提取字符串,不同大小的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25811534/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com