【问题标题】:SQL - concatenate strings in variable while loop with +=SQL - 用+=连接变量while循环中的字符串
【发布时间】:2020-09-17 11:36:40
【问题描述】:

在下面的这个例子中我不能连接! 当我循环时,我得到了 2 个正确的结果。 当我连接 @MaterialCompositionEn += ', ' 它工作正常 当我尝试连接 @MaterialCompositionEn += 相同的查询以获得第二行时,我有一个空值!

    DECLARE @MaterialCompositionId int = 475;
    DECLARE @MaterialCompositionKey nvarchar(50) = '202071512324138';
    DECLARE @Records nvarchar(250);
    DECLARE @RecordProceed int;
    DECLARE @MaterialCompositionEn nvarchar(500);

    SET @Records =  (SELECT STRING_AGG(Id, ',') FROM MaterialCompositions mc WHERE mc.MaterialCompositionId = @MaterialCompositionId)

    WHILE len(@Records) > 0
    BEGIN

        SET @RecordProceed = CAST(LEFT(@Records,4) AS int)
        if @RecordProceed > 0
            BEGIN
                SET @Records = REPLACE(@Records,substring(@Records, 1, 4),'')
            END
        if len(@Records) > 4
            BEGIN
                SET @Records = REPLACE(@Records,substring(@Records, 1, 1),'')
            END

        if len(@MaterialCompositionEn) > 0
            BEGIN
                SET @MaterialCompositionEn += ', '
            END
PRINT 'MaterialCompositionEn1: ' +  @MaterialCompositionEn

        SET @MaterialCompositionEn =
            (SELECT COALESCE (CAST(MaterialProportion AS nvarchar) + '% ', '') +
                (SELECT mp.MaterialPrimaryEn + 
                    COALESCE(
                        (SELECT ' (' + ms.MaterialSecondaryEn + ')' AS MS1 FROM dbo.MaterialSecondaries AS ms WHERE ms.Id = mc.MaterialSecondaryId)
                    , '')
                FROM dbo.MaterialPrimaries AS mp WHERE mp.Id = mc.MaterialPrimaryId)
            FROM MaterialCompositions mc WHERE mc.Id = @RecordProceed
            )

PRINT 'MaterialCompositionEn2: ' +  @MaterialCompositionEn
    END

结果:

MaterialCompositionEn2: 20% Cashmere
MaterialCompositionEn1: 20% Cashmere, 
MaterialCompositionEn2: 80% Wool

现在当我改为:

SET @MaterialCompositionEn +=
            (SELECT COALESCE......

我预计 20% 羊绒,80% 羊毛 相反,我的 3 张照片为 NULL 我尝试投射但无济于事。

有什么想法吗? 提前致谢

【问题讨论】:

  • '某事' + NULL = NULL
  • 您使用的是哪个 dbms? (该代码是特定于产品的。)
  • 这看起来像 SQLServer,考虑CONCAT() 处理空值而不需要太多合并

标签: sql concatenation


【解决方案1】:

我猜有一种更简单的方法可以做你想做的事。但是,我认为问题在于您需要初始化字符串。所以在代码块的顶部放:

SET @MaterialCompositionEn = '';

【讨论】:

  • @Philippe 。 . .您需要提出一个新的问题,其中包含示例数据、期望的结果以及您想要实现的逻辑的解释。
【解决方案2】:
   SET @MaterialCompositionEn =
            SELECT 
                CONCAT(
                  mp.MaterialPrimaryEn, ' ', MaterialProportion, '% ', --always show primary
                  ', ' + ms.MaterialSecondaryEn + CONCAT(100 - MaterialProportion, '%')  --sometimes show secondary
                ) 
            FROM 
                MaterialCompositions mc 
                INNER JOIN dbo.MaterialPrimaries mp ON mp.Id = mc.MaterialPrimaryId
                LEFT JOIN dbo.MaterialSecondaries ms ON ms.Id = mc.MaterialSecondaryId
                WHERE mc.Id = @RecordProceed
            )

这样的东西可能更整洁.. 请注意,我不清楚 MaterialProportion 来自哪里(我怀疑 MaterialCompositions),所以这可能不是一个解决方案,只是关于如何使用 CONCAT/避免使用的说明大量嵌套选择。使用 INNER/OUTER 连接链接组合物,绝对是主要的,可能是次要的材料。如果次要材料为空,则目标是通过 CONCAT 和 + 的混合搭配来隐藏它

CONCAT 将 null 视为空字符串,其中 as + 导致整个表达式变为 null。这对于混合和匹配可能很有用,例如类似', ' + ms.MaterialSecondaryEn + CONCAT(100 - MaterialProportion, '%'):

  • CONCAT(100 - MaterialProportion, '%') 将是 20%(如果主要材料是 80%)但是
  • ', ' + ms.MaterialSecondaryEn + CONCAT(...) 作为一个整体是NULL,如果来自左连接的 MaterialSecondaryEn IS NULL 无法匹配,那么在只有主要材料的情况下,描述次要材料的字符串应该完全消失为 NULL,外部CONCAT 处理为空字符串

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    相关资源
    最近更新 更多