我想创建一个变量,其中包含我们需要搜索的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)