【问题标题】:T-SQL trying to determine the largest string from a set of concatenated strings in a databaseT-SQL 试图从数据库中的一组连接字符串中确定最大的字符串
【发布时间】:2015-02-07 23:00:16
【问题描述】:

我有两张桌子。一个有订单号和订单详情:

CREATE TABLE #Order ( OrderID int )

第二个包含关于订单的cmets:

CREATE TABLE #OrderComments ( OrderID int
                              Comment VarChar(500) )
Order ID      Comments
~~~~~~~~      ~~~~~~~~
1             Loved this item!
1             Could use some work
1             I've had better
2             Try the veal

我的任务是确定输出的最大长度,然后返回如下输出:

Order ID      Comments                                                  Length
~~~~~~~~      ~~~~~~~~                                                  ~~~~~~
1             Loved this item! | Could use some work | I've had better  56
2             Try the veal                                              12

所以,在这个例子中,如果这是所有数据,我正在寻找“56”)。

主要目的是确定所有 cmets 附加在一起时的最大长度,包括 | 分隔符。这将在构建此输出将放入的表时使用,以确定我们是否可以在the 8,060 size limit for a row 中获取数据,或者我们是否需要使用 varchar(max) 或 text 来保存数据。

我已经尝试了几个可以生成此输出到变量的子查询,但我还没有找到可以生成上述输出的子查询。如果我能得到那个,那么我就可以通过SELECT TOP 1 ... ORDER BY 3 DESC 得到我正在寻找的号码。

【问题讨论】:

    标签: sql-server string tsql concatenation string-concatenation


    【解决方案1】:

    要找出最长字符串的长度,如果您修剪并连接属于 OrderId 的所有(非空)cmets,您可以使用长度为 3 的分隔符

    SELECT TOP(1) SUM(LEN(Comment)) + 3* (COUNT(Comment) - 1) AS Length
    FROM OrderComments
    GROUP BY OrderId
    ORDER BY Length DESC
    

    要实际进行连接,您可以使用XML PATH,如本网站上的许多其他答案所示。

    WITH O AS
    (
    SELECT DISTINCT OrderID
    FROM #Order
    )
    SELECT O.OrderID,
           LEFT(y.Comments, LEN(y.Comments) - 1) AS Comments
    FROM   O
           CROSS APPLY (SELECT ltrim(rtrim(Comment)) + ' | '
                        FROM   #OrderComments oc
                        WHERE  oc.OrderID = O.OrderID
                        AND Comment  IS NOT NULL
                        FOR XML PATH(''), TYPE) x (Comments)
           CROSS APPLY (SELECT x.Comments.value('.', 'VARCHAR(MAX)')) y(Comments)
    

    【讨论】:

    • 疯狂的是,我在发布问题后的几分钟内就找到了这个答案。现在,知道如何生成上面的输出,并将值连接在一起吗?
    • 我查看了XML PATH,但也读到如果&< 可能出现在文本中,则不应使用它,这很容易包含这些内容。
    • @Dan 它可以使用,但您需要使用它与找到的更常见的代码稍有不同。见stackoverflow.com/a/1052353/73226
    • CONCAT 的变体是否可用于早于 2014 年的 SQL Server 版本?
    • 噢!当然。在这里,我认为这是更新的 SQL Server 的一些新功能......(facepalm)
    【解决方案2】:

    您只需要 STUFF 函数和 XML PATH

    看看这个 sql fiddle http://www.sqlfiddle.com/#!3/65cc6/5

    【讨论】:

      猜你喜欢
      • 2015-06-21
      • 2011-03-23
      • 1970-01-01
      • 2015-03-30
      • 2010-11-18
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多