生成一个列表变量,并使用null作为if/else选择器



我想创建一个变量,其中包含我们需要搜索的UPC列表。代替使用:

select * from foo
where upc in (3410015215, 3410015217, 3410015243) 

我想说这样的话:

Declare @UPCList    Varchar(255)    = (3410015215, 3410015217, 3410015243)
--If you want to check all stores, swap the commentation status of the next two lines
--Declare @Store        int             = NULL
Declare @Store        int             = 203

我的第二个问题是,我想搜索特定商店的fleem,但如果有人想搜索所有商店,那么他们应该能够使@Store等于NULL

select * from foo p
inner join fleem f on p.upc = f.upc_id
if (@Store is NULL)
begin
where f.BOH = 1
end
else (@Store is not NULL)
begin
where f.store = @Store AND f.BOH = 1
end

这些事情可能吗?如果是这样的话,最好的方法是什么?

SQL中没有"list"类型。在SQL中,列表只是一个表或一个具有单列但有许多行的临时表。

要解决您的第一个问题,您可以将值存储在临时表中,然后根据该表连接以创建您要查找的筛选器。

CREATE TABLE #MyList (
upcs VARCHAR(MAX)
)
INSERT INTO #MyList (upcs)
VALUES
(123),
(456),
(789)

然后在与foo、的内部联接中使用#MyList

SELECT * FROM foo AS f
INNER JOIN #MyList AS ml
ON f.upcs = ml.upcs

然后,对于第二个问题,您所需要做的就是在加入后包含一个WHERE子句和一个CASE语句,

select * from foo p
inner join fleem f on p.upc = f.upc_id
WHERE f.BOH = CASE 
WHEN @Store IS NULL THEN f.BOH
ELSE @Store 
END

很确定这应该是两个单独的问题,但以下是我的答案。我假设您使用的是SQL Server,但我可能错了,因为您没有标记DBMS。下面的代码可能适用于其他系统,但我不做任何承诺:

Q1:表格变量

您可以使用表变量来做您在第一个问题中所问的事情。请参阅下面的代码。

DECLARE @UPCList as TABLE (upc int)
INSERT INTO @UPCList
VALUES
(3410015215),
(3410015217),
(3410015243)

在这之后,您可以使用@UPCList做您可以使用普通表做的所有事情。

Q2:设置逻辑

不允许在查询中使用IF/THEN。但是,您所描述的逻辑很容易转换为标准WHERE子句。

SELECT
* 
FROM
foo p
JOIN fleem f on p.upc = f.upc_id
WHERE
f.boh = 1
AND (f.store = @Store 
OR @Store is NULL)

最新更新