【问题标题】:SQL Function inside of where clause to see if field is in concatenated list (from parameter)where 子句中的 SQL 函数,用于查看字段是否在串联列表中(来自参数)
【发布时间】:2020-01-08 19:31:00
【问题描述】:

我有这两行

,SUM (CASE WHEN (DATEDIFF(DAY,Shopify_Ordered,Confirmed) >= 1)THEN 1 ELSE 0 END) OVER () Orders1DayNotShipped
,dbo.GROUP_CONCAT( (CASE WHEN (DATEDIFF(DAY,Shopify_Ordered,Confirmed) >= 1)THEN Customer_Purchase_Order_Number END)) OVER () Orders1DayNotShippedString

第一行计算的是一日未发货的订单数量。 第二行使用 Group_Concat 函数(可在此处找到:https://archive.codeplex.com/?p=groupconcat)返回延迟订单的订单号列表。

这是一个示例结果:91149220,91155318,91155319 等

现在我要做的是获取该结果/字段,然后通过 SSRS 将其传递给另一个报告。我可以轻松地将这个参数传递给另一个报告,我只需要一些帮助使其真正起作用。我希望第二份报告获取这些订单号并向我显示所有这些订单。

所以对于我的第二份报告,我设置了参数,这就是我尝试为我的 where 子句做的事情

WHERE 1=1 
    ...
    AND (@LocalOrderList IS NULL OR (Customer_Purchase_Order_Number in dbo.[Z_N_CSVToList](@LocalOrderList)))

Z_N_CSVToList 是一个简单的函数,可以将一个字符串分解为一个列表。就是这样:

ALTER FUNCTION [dbo].[Z_N_CSVToList] (@CSV varchar(MAX)) 
    RETURNS @Result TABLE (Value varchar(300))
AS   
BEGIN
    DECLARE @List TABLE
    (
        Value varchar(300)
    )

    DECLARE
        @Value varchar(300),
        @Pos int

    SET @CSV = LTRIM(RTRIM(@CSV))+ ','
    SET @Pos = CHARINDEX(',', @CSV, 1)

    IF REPLACE(@CSV, ',', '') <> ''
    BEGIN
        WHILE @Pos > 0
        BEGIN
            SET @Value = LTRIM(RTRIM(LEFT(@CSV, @Pos - 1)))

            IF @Value <> ''
                INSERT INTO @List (Value) VALUES (@Value) 

            SET @CSV = RIGHT(@CSV, LEN(@CSV) - @Pos)
            SET @Pos = CHARINDEX(',', @CSV, 1)
        END
    END     

    INSERT @Result
    SELECT
        Value
    FROM
        @List

    RETURN
END

我该如何进行这项工作?现在运行它会给我错误“'dbo'附近的语法不正确。”

我是否必须在 group concat 行中的订单号周围添加引号?

编辑:我想通了。如果我将 where 子句更改为此,它会起作用。

AND (@LocalOrderList IS NULL OR (Customer_Purchase_Order_Number in (Select * from dbo.[Z_N_CSVToList](@LocalOrderList))))

但现在我的报告只返回列表中的第一个订单,而不是全部。知道为什么吗?

【问题讨论】:

    标签: sql sql-server group-concat


    【解决方案1】:

    使用exists应该是这样的

    AND (@LocalOrderList IS NULL OR 
    (exists (select 1 from dbo.[Z_N_CSVToList](@LocalOrderList) v
    where Customer_Purchase_Order_Number = v.value
    )))
    

    【讨论】:

    • 什么是?
    • 其实我的使用方式 (Select * from dbo.[Z_N_CSVToList](@LocalOrderList) 是有效的,我只是犯了一个错误,但是用你的方式这样做有什么好处吗?
    • exists over in 有什么好处?
    • exists 在第一个匹配时停止,而in 读取整个表然后返回匹配
    猜你喜欢
    • 2015-03-07
    • 2012-02-12
    • 2021-01-11
    • 2011-11-22
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    相关资源
    最近更新 更多