是否可以执行此类查询

时间:2017-05-25 03:30:43

标签: sql sql-server database

我有SQL Server表,我应该创建一个查询,它可以根据单个查询中参数/搜索条件的任意输入组合绘制相同的数据

例如,用户为我们提供型号以搜索表1中的所有产品。

我会按如下方式创建一个查询:

SELECT * 
FROM Products 
WHERE pModel = @pUserModel; 

接下来,另一位用户向我们提供了产品的描述,然后我必须创建另一个查询,如下所示:

SELECT * 
FROM Products 
WHERE pDescription = @pUserDescription;

表1

Products (pNo, pModel, pDescription, pQty, pGlobalQty, pParent)

我的问题是,不是基于不同参数创建的两个查询,有没有办法创建单个查询,它将能够由不同的用户满足这两个搜索条件?

3 个答案:

答案 0 :(得分:0)

如果我理解您的要求,则需要joinOR条件

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