【问题标题】:SQL query string comparisonSQL查询字符串比较
【发布时间】:2019-02-08 23:40:10
【问题描述】:

我有以下两个表,即 InvoiceData 和 OrderData 订单表显示已订购的内容,发票显示已交付的内容以及产品 ID 和其他信息。我想通过逗号 (,) 拆分来比较两个表上的产品 ID 字段,并希望从 Invoice 数据表中获取行,即使订单的产品表中只有一个产品 ID。 例如结果我应该得到发票#s 123,3334,3456 & 3435。

我已经尝试过 split_String 但我的环境。是 sql server 2012,我得到了一个错误。

谁能帮帮我。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

您可以颠倒 ID 的存储方式。为此,您还需要三个表。

我建议阅读多对多关系(例如产品 -> 发票和产品 -> 订单之间的关系)

没有必要,但我建议从命名约定中删除“数据”,因为假定数据库中的任何表都包含数据,这对描述没有帮助。

Product Orders and Invoices

【讨论】:

  • 感谢您的评论。我现在无法反转 ID 存储。
【解决方案2】:

以下函数将在 2012 年用作字符串拆分

CREATE FUNCTION [dbo].[fn_string_split](@str       NVARCHAR(MAX), 
                                        @delimiter NVARCHAR(255))
RETURNS TABLE
AS
     RETURN
     WITH a
          AS (SELECT CAST(0 AS BIGINT) AS idx1, 
                     CHARINDEX(@delimiter, @str) idx2
              UNION ALL
              SELECT idx2 + 1, 
                     CHARINDEX(@delimiter, @str, idx2 + 1)
              FROM a
              WHERE idx2 > 0)
          SELECT SUBSTRING(@str, idx1, COALESCE(NULLIF(idx2, 0), LEN(@str) + 1) - idx1) AS value, 
                 ROW_NUMBER() OVER(
                 ORDER BY idx1) RN
          FROM a;

然后您可以通过交叉应用来使用它。

DECLARE @Invoices AS TABLE
(InvoiceNumber NVARCHAR(50), 
 ProductIDCSV     NVARCHAR(MAX)
);
INSERT INTO @Invoices
VALUES
('123','Prod123,Prod456,Prod789'),
('456','Prod987,Prod654,Prod321');
SELECT I.*, 
       P.Value AS ProductID
FROM @Invoices I
     CROSS APPLY dbo.fn_string_split(I.ProductIDCSV, ',') P;

这将为您提供发票编号和离散产品 ID 的列表,然后您可以执行所需的任何比较。这应该会让您走上正确的答案之路。

附带说明,如果您提供可剪切和粘贴的数据集,而不是图像,那么那些试图帮助您的人的生活会变得更轻松。如果您看到我设置了一个 tvp 和一个插入的第二个脚本,那是一种简单的方法。

【讨论】:

    【解决方案3】:

    感谢大家的回答。 我终于在下面的链接中遵循了 Aaaron 的解决方案。 https://sqlperformance.com/2012/07/t-sql-queries/split-strings

    我必须使用字符串拆分来比较两个产品 ID 的列。虽然这不是一个好的解决方案,但是对于这样的非标准化数据,这似乎是一种可行的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      相关资源
      最近更新 更多