【问题标题】:T-SQL - Set variable during SELECT statementT-SQL - 在 SELECT 语句期间设置变量
【发布时间】:2020-11-28 06:09:36
【问题描述】:

我想在 SQL 查询中间设置一个变量。

我有多个“标志”,我希望查询在结果列中报告有关客户的所有真实标志。 因此,我不能使用 CASE 语句,因为一旦找到第一个“真”语句,它就会停止评估。 为了解决这个问题,我使用一组 if IF 语句将相关标志附加到变量,然后在 Result 列中报告该变量。但是,我对此无能为力。

下面的代码当然不会运行。如何重新组织此查询以使其符合犹太教规?

想要的结果是这样的:

代码如下:

DECLARE 
@CountOfOrders int = 0,
@resultstring varchar(max) = ''

SELECT 
Customers.CustomerName,
CountOfOrders.CountOfOrders,
@resultstring as Result

From 
--Get some basic data from the query's base table:
(Select 'James Bond' as CustomerName) Customers


--Get some extra data about James Bond's orders from a different table,
--Let's just say he's got 35 orders:
OUTER APPLY (
                SELECT CAST(35 AS INT) as CountOfOrders
            ) CountOfOrders


--Now do some number crunching:
Set @CountOfOrders = CountOfOrders.CountOfOrders
IF @CountOfOrders > 10 set @resultstring = @resultstring + 'James Bond has greater than 10 orders. '
IF @CountOfOrders > 20 set @resultstring = @resultstring + 'James Bond has greater than 20 orders. '
IF @CountOfOrders > 30 set @resultstring = @resultstring + 'James Bond has greater than 30 orders. '
IF @CountOfOrders > 40 set @resultstring = @resultstring + 'James Bond has greater than 40 orders. '
IF @CountOfOrders > 50 set @resultstring = @resultstring + 'James Bond has greater than 50 orders. '

【问题讨论】:

    标签: sql sql-server string tsql count


    【解决方案1】:

    在一系列case 表达式之上使用concat_ws() 怎么样?

    concat_ws(
        ' ',
        case when CountOfOrders > 10 
            then concat(CustomerName, ' has more than 10 orders.')
        end,
        case when CountOfOrders > 20 
            then concat(CustomerName, ' has more than 20 orders.')
        end,
        case when CountOfOrders > 30 
            then concat(CustomerName, ' has more than 30 orders.')
        end
    ) as result
    

    您可以根据需要向 concat_ws() 添加更多 epwresssions。这个函数应该直接放在你的select 子句中(然后你就不需要这个变量了)。

    【讨论】:

      【解决方案2】:

      您可以只使用CONCAT_WS()(或旧版本 SQL Server 中的类似构造:

      select @resultstring = CONCAT_WS(' ',
                                       (CASE WHEN CountOfOrders > 10 THEN 'James Bond has greater than 10 orders.' END),
                                       (CASE WHEN CountOfOrders > 20 THEN 'James Bond has greater than 20 orders.' END),
                                       . . .
                                      )
      from . . .;
      

      【讨论】:

        【解决方案3】:

        重新整理代码

        DECLARE 
        @CountOfOrders int = 0,
        @resultstring varchar(max) = ''
        
        --Get some extra data about James Bond's orders from a different table,
        --Let's just say he's got 35 orders:
        
        --Now do some number crunching:
        Set @CountOfOrders = (
                        SELECT CAST(35 AS INT) as CountOfOrders
                    ) 
        IF @CountOfOrders > 10 set @resultstring = @resultstring + 'James Bond has greater than 10 orders. '
        IF @CountOfOrders > 20 set @resultstring = @resultstring + 'James Bond has greater than 20 orders. '
        IF @CountOfOrders > 30 set @resultstring = @resultstring + 'James Bond has greater than 30 orders. '
        IF @CountOfOrders > 40 set @resultstring = @resultstring + 'James Bond has greater than 40 orders. '
        IF @CountOfOrders > 50 set @resultstring = @resultstring + 'James Bond has greater than 50 orders. ' 
        
        SELECT 
        Customers.CustomerName,
        @CountOfOrders,
        @resultstring as Result
        
        From 
        --Get some basic data from the query's base table:
        (Select 'James Bond' as CustomerName) Customers
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-12
          • 2020-06-19
          • 2011-03-24
          • 2012-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多