[英]How to use an Excel cell value as a variable in a SELECT statement in Power Query?
[英]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) ='')
你会得到:
您可以添加此条件以防止在两个输入均为空/空时返回任何行:
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.