【问题标题】:How do I find a substring that always consists of an exact number of character types?如何找到始终包含确切数量的字符类型的子字符串?
【发布时间】:2019-09-17 21:44:58
【问题描述】:

我在表中有一个列,我想在其中提取一个子字符串,以便将其用作另一个表的连接。

但是我有一个问题。子字符串并不总是在同一个位置或前面有同一个字符。

例如来自以下:

SA 2019M05 7022b000003CDMmAAO - SA20190323 - 2019-03-23 09:20:00 Europe/Amsterdam

我只需要:

7022b000003CDMmAAO

我尝试将SUBSTRINGCHARINDEX 结合使用,并且它正在工作。 但是,我不想依赖始终以 70 开头的子字符串。

另外,代码并不总是在- 前面。一致的一个部分是代码的制作方式。它总是按以下特定顺序由数字和字母组成:0000a000000aaaaaaa

SELECT 
CASE WHEN t.[jobName] LIKE '%70%' THEN SUBSTRING(t.[jobName],CHARINDEX('70',t.[jobName]),+18) ELSE NULL END AS [Code]
FROM table  t

那么有没有办法让我找到由0000a000000aaaaaaa 类型字符组成的子字符串?

【问题讨论】:

  • patindex('%[0-9][0-9][0-9][0-9][a-z][0-9][0-9][0-9][0-9][0-9][0-9][a-z][a-z][a-z][a-z][a-z][a-z][a-z]%', t.[jobName])?
  • 代码总是在第二个空格之后吗?不止一个样本,显示不同的变化,会使事情变得更容易;因为我们不需要猜测。
  • 看起来像一个空格分隔的字符串,如果是这样,你可以简单地提取第二个和第三个空格之间的所有内容。
  • 不,很遗憾没有。从现在开始,代码将从子字符串开始。但我仍然需要修复过去的所有子字符串。
  • 所有的 old 都是第三个(空格)分隔的项目吗?同样,更多样本真的会有所帮助。

标签: sql sql-server database string substring


【解决方案1】:

感谢@Gserg patindex 正在工作:

SELECT 
 CASE WHEN PATINDEX('%[0-9][0-9][0-9][0-9][a-z][0-9][0-9][0-9][0-9][0-9][0-9][a-z]%',t.[jobName]) = 0 THEN NULL 
      ELSE SUBSTRING(t.[jobName],PATINDEX('%[0-9][0-9][0-9][0-9][a-z][0-9][0-9][0-9][0-9][0-9][0-9][a-z]%',t.[jobName]),+18) END AS [Code]
FROM table t

我只使用了前 12 个字符,因为我发现最后一部分可能会有所不同。添加时的情况,所以我只显示添加代码的作业名称。它看起来并不漂亮,但它可以完成工作。

【讨论】:

    【解决方案2】:

    另一种可能的方法是拆分文本数据并进行必要的检查。使用PATINDEX()SUBSTRING() 是一种可行的解决方案,但这里的一个优点是您可以分析分割文本的每个部分。对于 SQL Server 2016+,您可以使用 STRING_SPLIT() 函数来拆分值。

    输入:

    CREATE TABLE #Data (
       JobName varchar(100)
    )
    INSERT INTO #Data
       (JobName)
    VALUES
       ('SA 2019M05 7022b000003CDMmAAO - SA20190323 - 2019-03-23 09:20:00 Europe/Amsterdam'),
       ('Randombla2019M04 7033v000000G2ZRBB0 - Randombla20190412 - 2019-04-17 09:40:00 Europe/Amsterdam'),
       ('AnotherRandom170419 7055v000000V3a9BB0 - NB-AnotherRandom - 2019-04-17 09:51:51 Europe/Amsterdam')
    

    声明:

    SELECT s.[value] AS [Code]
    FROM #Data d
    OUTER APPLY 
       ( 
       SELECT [value]
       FROM STRING_SPLIT(d.JobName, ' ')
       WHERE PATINDEX('%[0-9][0-9][0-9][0-9][a-z][0-9][0-9][0-9][0-9][0-9][0-9][a-z][a-z][a-z][a-z][a-z][a-z][a-z]%', [value]) > 0
       ) s
    

    输出:

    ------------------
    Code
    ------------------
    7022b000003CDMmAAO
    NULL
    NULL
    

    【讨论】:

      【解决方案3】:

      我在表中有一个列,我想在其中提取一个子字符串,以便将其用作另一个表的连接。

      对于JOIN,您不必提取值。为此,您可以使用LIKE

      SELECT . . .
      FROM t JOIN
           anothertable t2
           ON t.jobName LIKE '% ' + t2.col + ' %'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-18
        • 1970-01-01
        • 2018-09-26
        • 2022-01-10
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 2013-09-28
        相关资源
        最近更新 更多