我有SQL Server表,我应该创建一个查询,它可以根据单个查询中参数/搜索条件的任意输入组合绘制相同的数据
例如,用户为我们提供型号以搜索表1中的所有产品。
我会按如下方式创建一个查询:
SELECT *
FROM Products
WHERE pModel = @pUserModel;
接下来,另一位用户向我们提供了产品的描述,然后我必须创建另一个查询,如下所示:
SELECT *
FROM Products
WHERE pDescription = @pUserDescription;
表1
Products (pNo, pModel, pDescription, pQty, pGlobalQty, pParent)
我的问题是,不是基于不同参数创建的两个查询,有没有办法创建单个查询,它将能够由不同的用户满足这两个搜索条件?
答案 0 :(得分:0)
如果我理解您的要求,则需要join
和OR
条件
select * from Products p
left join Model m
on p.pModel=m.mModel
where (p.pModel = @pUserModel
OR p.pDescription = @pUserDescription)
左连接以从Products返回记录,即使没有与之关联的Model也是如此。如果您不想要,可以将其更改为INNER JOIN
。
答案 1 :(得分:0)
您可以查找参数字符串的修剪长度作为OR条件的一部分,并始终提供这两个参数,即使其中一个是空字符串“”。像
这样的东西SELECT
P.*
from
Products P
where
( LEN( RTRIM( @pUserModel )) = 0
OR P.pModel = @pUserModel )
OR
( LEN( RTRIM( @pUserDescription )) = 0
OR P.pDescription = @pUserDescription )
如果您查询诸如pDescription =''之类的地方,如果描述列实际上具有值,则它将失败。因此,如果TRIMMED参数的长度= 0,则将每个包装在OR条件中以表示它是正常的,或者它与正在搜索的参数匹配。如果您想要通配符搜索,请务必添加'%'
要消除OR限定符,如果您的空参数只是'%',则会为相应的参数提取所有内容。所以你可以有一个model ='%'和description ='Something%'......反之亦然...... Model ='Some Model%'和Description ='%'
我将products表别名为“P”以简化可读性。特别是如果您有多个表,则应始终确定表/列的来源,以便其他人提供帮助。
答案 2 :(得分:0)
declare @pUserModel varchar(50)
declare @pUserDescription varchar(50)
---如果您想使用单个搜索参数进行搜索,请尝试使用此功能。
if (@pUserModel <> '')
begin
SELECT * FROM Products WHERE pModel = @pUserModel;
end
else if (@pUserDescription <> '')
begin
SELECT * FROM Products WHERE pDescription = @pUserDescription;
end
---如果你想要将所有搜索参数组合起来而不是尝试使用它。
SELECT * FROM Products WHERE LTRIM(RTRIM(pModel)) = @pUserModel or LTRIM(RTRIM(pDescription)) = @pUserDescription