繁体   English   中英

Power Query - 如何将空白 Excel 单元格作为 NULL 值传递?

[英]Power Query - How to pass blank Excel cell as NULL value?

我有看起来像这样的 SQL,它在 SSMS 中运行良好:

    DECLARE @pPart  VARCHAR(100)    =   '00039',    
            @pColor VARCHAR(100)    =   '01816'         

    SET     @pPart   = ISNULL(@pPart,'-1')          
    SET     @pColor  = ISNULL(@pColor,'-1')         

    SELECT  *
    FROM    myTable
    WHERE   (PartID  IN (SELECT (@pPart))  OR @pPart  = '-1')
    AND     (ColorID IN (SELECT (@pColor)) OR @pColor = '-1')

如果我将 DECLARE 中的一个值(或两个值)从一个值更改为 NULL,代码将返回我期望的结果。 我只是不确定如何在 Power Query 中进行这项工作。 如果两个单元格都填充了值,则查询有效。 如果我从任一单元格中删除该值,它只会返回我数据库中所有表的列表(奇怪......)。

我创建了一个名为“GetValues”的命名范围,它涵盖 B2:B3,如下所示:

姓名 价值
部分 00039
颜色 01816

在 Power Query 的高级编辑器中,我的查询如下所示:

let
    Source  = Excel.CurrentWorkbook(){[Name="GetValues"]}[Content],
    pPart   = Source{1}[Column1],
    pColor  = Source{2}[Column1],
    Query   = "

    DECLARE @pPart  VARCHAR(100)    =   '"& pPart &"',  
            @pColor VARCHAR(100)    =   '"& pColor &"'          

    SET     @pPart  = ISNULL(@pPart,'-1')           
    SET     @pColor = ISNULL(@pColor,'-1')          

    SELECT  *
    FROM    myTable
    WHERE   (PartID  IN (SELECT (@pPart))  OR @pPart  = '-1')
    AND     (ColorID IN (SELECT (@pColor)) OR @pColor = '-1')
    ",

    Target = Sql.Database("myServer", "myDatabase", [Query=Query])
in
    Target

我尝试更改我的 SET 行,如果我将值更改为 '' 或 ' ',它也适用于 SSMS,但仍会在 Power Query 中返回我的数据库中所有表的列表。 我正在修剪字符串,以防用户在单元格中放置一个空格而不是将它们留空:

    IF LTRIM(RTRIM(@pPart))  = '' SET @pPart  = '-1' 
    IF LTRIM(RTRIM(@pColor)) = '' SET @pColor = '-1'        

那么如何将空白单元格作为 NULL 或至少作为 '' 传递?

编辑:我还尝试将我的查询剥离到基本框架,以查看正在传递哪些参数。 此查询成功返回 B2 中的值。

let
    Source  = Excel.CurrentWorkbook(){[Name="GetValues"]}[Content],
    pPart   = Source{1}[Column1],
    Query   = "

    DECLARE @pPart  VARCHAR(100)    =   '"& pPart &"'   
    SELECT  @pPart

    ",

    Target = Sql.Database("myServer", "myDatabase", [Query=Query])
in
    Target

现在我想看看当我包含空白单元格 B3 时会发生什么:

let
    Source  = Excel.CurrentWorkbook(){[Name="GetValues"]}[Content],
    pPart   = Source{1}[Column1],
    pColor  = Source{2}[Column1],
    Query   = "

    DECLARE @pPart  VARCHAR(100)    =   '"& pPart &"',  
            @pColor VARCHAR(100)    =   '"& pColor &"'          
    SELECT  @pPart, @pColor

    ",

    Target = Sql.Database("myServer", "myDatabase", [Query=Query])
in
    Target

此查询还返回了我的数据库中所有表的列表。

我也试过改变

in
    Target

in
    pColor 

并且查询预览以全部小写形式显示null ,这让我认为它确实返回了一个 null 值。 我只是不知道如何使这项工作。

如果目标是将空白单元格值视为通配符,那么这将起作用:首先删除 SET 语句,然后使用此 sql:

    SELECT  *
    FROM    myTable
    WHERE   (PartID  = @pPart OR @pPart  is null OR TRIM(@pPart) ='')
    AND     (ColorID = @pColor OR @pColor is null OR TRIM(@pColor) ='')

你会得到:

  • 所有行仅当两个变量都为空时。
  • 如果@pPart 不为空/空白并且没有匹配项,则没有行
  • 如果@pColor 不为空/空白并且没有匹配项,则没有行

您可以添加此条件以防止在两个输入均为空/空时返回任何行:

AND ( ISNULL(TRIM(pPart), '') <> '' OR  ISNULL(TRIM(pColor), '') <> '')

为了让它起作用,我必须在查询开始之前处理空值。 无论出于何种原因,将 pPart 或 pColor 作为 NULL 传递只会返回一个表列表,而实际上并未传递 NULL 值。 这似乎是有效的:

let
    Source  = Excel.CurrentWorkbook(){[Name="GetValues"]}[Content],
    pPart   = if Source{1}[Column1] = null then "-1" else Source{1}[Column1],
    pColor  = if Source{2}[Column1] = null then "-1" else Source{2}[Column1],
    Query   = "

    DECLARE @pPart  VARCHAR(100)    =   '"& pPart &"',  
            @pColor VARCHAR(100)    =   '"& pColor &"'          

    SELECT  *
    FROM    myTable
    WHERE   (PartID= '" & pPart & "' OR " & pPart & " = '-1')
    AND     (ColorID = '" & pColor & "' OR " & pColor & " = '-1')
    ",

    Target = Sql.Database("myServer", "myDatabase", [Query=Query])
in
    Target

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM