2016-09-21 62 views
1

我想创建一个商业目录,我在其中使用以下查询从包含商业信息的2个表中提取数据。TSQL查询过滤目录

select * 
from BND_Listing 
left join BND_ListingCategories on BND_Listing.CatID = BND_ListingCategories.CatID 
order by Company asc 

我有我使用的“过滤器”真的只是我需要添加到我上面的查询,将听来查询传递的字符串值组件来过滤上述查询,拥有3个下拉菜单形式由形式。

在我的形式提交我重新导向到相同的URL,但将基于从3个下拉选择字段值在我的网址如下。

filter-Category=[Category]&filter-City=[City]&filter-State=[State] 

我已经得到了这个工作正常,但没有价值传递到我的网址时有困难。当用户仅过滤3个可能字段中的1个时会发生这种情况。为了解决这个问题我想我可以创建一个“全”值会像过滤器国家= ALL

我如何更新我的查询提取数据侦听的查询字符串,这些过滤器?

任何洞察力,例子真的很感激。

希望我有道理我还是新的节目。

,直到所有的过滤器都设置下面的查询返回0的结果。如果只设置了1个过滤器,它会使我的应用程序崩溃。

select * 
from BND_Listing 
where 
    (Category = '[querystring:filter-Category]' 
    or '[querystring:filter-Category]'='All') 
    and 
    (City = '[querystring:filter-City]' 
    or '[querystring:filter-City]'='All') 
    and 
    (State = '[querystring:filter-State]' 
    or '[querystring:filter-State]'='All') 

UPDATE

感谢所有输入的每一个人。

我试图在SQL Server Management Studio中这个简化查询测试。

SELECT * 
FROM BND_listing 
WHERE city = IsNull('Trinity', city) 

它即使'三位一体其实在我在BND_Listing表记录一个返回城市没有结果。

我明白一切都会增加更多的过滤器,但这个基本的查询仍然不拉什么?

更新2

在这里我没有按排序按钮,并有尚未通过任何查询字符串值的网页加载。如果我想让我的网格加载所有表格记录,我应该为我的基本查询使用UNION命令。

select * 
from BND_Listing 

加上用于过滤结果的更复杂的查询?到目前为止,由于WHERE语句,下面的所有查询示例都不会从我的网格中抽取任何内容。

回答

1

限制优化你只限于一个选择查询必须放置在插件中?如果没有,我会创建一个存储过程并读取动态SQL。动态SQL将允许您根据您指定的任何条件动态生成并执行完全不同的查询。通过动态SQL,您还可以动态生成整个谓词,而不必硬编码每个条件。

另一种效率较低的方法是在谓词中使用LIKE而不是=。例如:

SELECT * 
FROM BND_Listing 
WHERE Category LIKE CASE 
        WHEN [querystring:filter-Category] = 'All' THEN '%' 
        ELSE '[querystring:filter-Category]' 
        END 
AND City LIKE CASE 
        WHEN [querystring:filter-City] = 'All' THEN '%' 
        ELSE '[querystring:filter-City]' 
        END 
AND State LIKE CASE 
        WHEN [querystring:filter-State] = 'All' THEN '%' 
        ELSE '[querystring:filter-State]' 
        END 
1

假设你要搜索'All'给定类别时没有过滤器存在,你可以只是把空滤为表示所有:

SELECT * 
FROM BND_Listing 
WHERE (Category = '[querystring:filter-Category]' OR 
     '[querystring:filter-Category]' = 'All' OR 
     COALESCE([querystring:filter-Category], '') = '') AND 
     (City = ...) 
... 
+0

谢谢蒂姆我刚刚读了一下关于COALESCE的了解。所以在你的例子(...)我会继续与COALESCE并包括所有的过滤器? – UserSN

1

也许你可以尝试这样的事情。

SELECT * 
    FROM BND_listing 
WHERE category = IsNull('[querystring:filter-Category]', category) 
    AND city = IsNull('[querystring:filter-City]', city) 
    AND state = IsNull('[querystring:filter-State]', state) 

该功能将检查活动过滤器是否存在,并比较适当的字段以确保它匹配。

在未设置过滤器的情况下,它会将该字段与自身进行比较,以便始终返回真实结果。

+0

只是为了澄清这是为了解决这个问题,而不添加所有的过滤器。如果ALL筛选器被传入,它将无法工作。除非其中一列是字符串“全部” –

+0

我已经设置了我的表单,因此如果没有选择类别,它会自动传递“全部”字符串 – UserSN

1

当你想要所有的记录,当输入是NULL然后处理它使用IS NULL

SELECT * 
FROM BND_listing 
WHERE (category = '[querystring:filter-Category]' OR [querystring:filter-Category]' is NULL) 
    AND (city = '[querystring:filter-City]' OR '[querystring:filter-City]' IS NULL) 
    AND (state ='[querystring:filter-State]' OR '[querystring:filter-State]' IS NULL) 

注:此方法将使用任何INDEX出现在Categorycitystate凡为ISNULLCOALESCE方法使用INDEX

+0

Prdp,在我的网格中使用此查询时,它不会提取任何数据。即使传递ALL的查询值。 也在页面加载没有查询字符串加载,直到有人按搜索,我想我所有的记录加载。 – UserSN

+0

不通过全部通过无效 –

+0

即使通过Null,我的网格也是空的。然而,我修改查询有点使用左连接附加我的类别表会影响功能? – UserSN