SQL查询过滤目录

TSQL query to filter directory

我正在尝试创建一个企业目录,我在其中使用以下查询从包含企业信息的 2 table 中提取数据。

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

我有一个表单,其中有 3 个下拉菜单,我使用 "Filters" 过滤上述查询,它们实际上只是我需要添加到上面的查询中的组件,它将侦听传入的查询字符串值通过表格。

在提交我的表单时,我将重定向回相同的 URL,但会根据从 3 个下拉字段中选择的值在我的 URL 中添加以下内容。

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

我的这个工作正常,但是当没有值传递到我的 URL 时我遇到了困难。当用户仅按 3 个可能字段中的 1 个进行过滤时,就会发生这种情况。为了解决这个问题,我想我可以创建一个类似于 filter-State=ALL

的 "All" 值

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

非常感谢任何见解和示例。

希望我说得有道理我还是编程新手。

在设置所有过滤器之前,以下查询 returns 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')

更新:

感谢大家的意见。

我已经在 SQL Server Management Studio 中尝试了这个简化的查询来测试。

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

它 returns 没有结果,尽管 'Trinity' 实际上是我在 BND_Listing table.

中的一个记录中的城市

我知道 ALL 会添加更多过滤器,但这个基本查询仍然没有提取任何内容?

更新 2:

在页面加载时我没有按下排序按钮并且还没有传递任何查询字符串值。如果我希望我的网格加载所有 table 记录,我应该为我的基本查询使用 UNION 命令。

select *  
from BND_Listing

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

假设您想在没有过滤器的情况下搜索给定类别的 'All',您可以将空过滤器视为全部:

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

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

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)

此功能将检查活动过滤器(如果存在)并比较适当的字段以确保其匹配。

在没有设置过滤器的情况下,它会将字段与自身进行比较,因此它总是 return 一个真实的结果。

当输入为 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)

注意: 此方法将使用 Categorycitystate 上的任何 INDEX,其中 ISNULLCOALESCE 方法将限制优化器使用 INDEX

您是否仅限于必须放置在插件中的 select 查询?如果没有,我会创建一个存储过程并阅读动态 SQL。 Dynamic 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