【问题标题】:Extract number from string in SQL Server从 SQL Server 中的字符串中提取数字
【发布时间】:2021-12-08 06:28:42
【问题描述】:

我有一个表格,其中有一列包含特定流程的不同备注。

有时有 1 条评论,有时有 4 条不同的评论。

看起来像这样:

Remarks 
|180|
|180|
|180|
|180|360|
|180|
|180|
|180|
|180|360|

我需要在不同的列中有备注。

我正在看一些具体的评论,所以我可以为每列创建一个案例。

您能建议如何提取或查找元组中的数字吗?

【问题讨论】:

  • 那么您是否在列中存储分隔数据?这才是真正的问题,修复你的设计,修复问题。它不应该是带有分隔数据的 1 列,也不应该是 4 列;它应该(可能)是 2 列;一个备注编号和一个备注值。
  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。
  • ^ 特别是#4

标签: sql-server substring charindex


【解决方案1】:

在 SQL Server 2016 及更高版本中:

;WITH shattered AS 
(
  SELECT t.Remarks, j.[key], j.value
    FROM dbo.TheTable AS t
    CROSS APPLY 
      OPENJSON('["' + REPLACE(t.Remarks, '|', '","') + '"]') AS j
    WHERE j.value > ''
)
SELECT Remarks, 
       Remark1 = [1], 
       Remark2 = [2], 
       Remark3 = [3], 
       Remark4 = [4]
FROM shattered 
PIVOT (MAX(value) FOR [key] IN ([1],[2],[3],[4])) AS p;

【讨论】:

    【解决方案2】:

    您可以在现代版本的 SQL Server 上使用 STRING_SPLITPIVOT

    SELECT
      Remarks.*
    FROM YourTable t
    CROSS APPLY (
        SELECT *
        FROM (
            SELECT
              s.value,
              rn = CONCAT('Remarks', ROW_NUMBER() OVER (ORDER BY (SELECT NULL)))
            FROM STRING_SPLIT(t.Remarks, '|') s
            WHERE s.value <> ''
        ) s
        PIVOT (
            MAX(value) FOR (rn IN
                (Remarks1, Remarks2, Remarks3, Remarks4)
        ) p
    ) Remarks;
    

    【讨论】:

    • 好吧,ORDER BY (SELECT NULL) 不保证订单。来自the docsThe output rows might be in any order. The order is not guaranteed to match the order of the substrings in the input string. 也许顺序对 OP 来说并不重要,也许它在实践中永远不会失败;但它可能是,它可能。
    • 首先,在 OP 中没有提及。其次,微软向您确认他们正在保证这一点。不久前我们争论过它,我根本不知道它怎么可能导致其他任何事情。 ROW_NUMBER 是在最低级别计算的,在PIVOT 之前,编译器没有理由对结果重新排序(STRING_SPLIT 本身总是串行的,ROW_NUMBER 也是如此,所以你不能有它们之间的平行区域)
    • 微软的某人说他们相信这就是它的工作原理。微软的其他人 表示不能保证,并消除任何建议。关键是,这并不能保证,任何使用该代码的人都应该意识到这一点。
    猜你喜欢
    • 2019-08-06
    • 2021-07-03
    • 2021-11-22
    • 1970-01-01
    • 2016-11-24
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多