如何使where子句在Sql Server中成为可选的?
我有一个类似用户将搜索记录的情况,他们将在where子句中给出条件。因此,他们可能会给出条件,也可能不会。那么在这个条件下如何进行查询 例如,用户可以搜索所有记录。有时,他们可能会搜索介于之间的日期。因此,如何查询日期的列字段是可选的 这是我的问题如何使where子句在Sql Server中成为可选的?,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有一个类似用户将搜索记录的情况,他们将在where子句中给出条件。因此,他们可能会给出条件,也可能不会。那么在这个条件下如何进行查询 例如,用户可以搜索所有记录。有时,他们可能会搜索介于之间的日期。因此,如何查询日期的列字段是可选的 这是我的问题 select transactions.storeid as StoreID, MONTH(transactions.Time) Month, transactionsEntry.TransactionNumber,transac
select transactions.storeid as StoreID, MONTH(transactions.Time) Month,
transactionsEntry.TransactionNumber,transactionsEntry.Quantity,
items.ItemLookupCode,items.DepartmentID,items.CategoryID,items.SubDescription1,
suppliers.SupplierName,suppliers.Code
FROM [HQMatajer].[dbo].[Transaction] as transactions
RIGHT JOIN [HQMatajer].[dbo].[TransactionEntry] as transactionsEntry
ON transactions.TransactionNumber=transactionsEntry.TransactionNumber
INNER JOIN [HQMatajer].[dbo].[Item] as items
ON transactionsEntry.ItemID=items.ID
INNER JOIN [HQMatajer].[dbo].[Supplier] as suppliers
ON items.SupplierID=suppliers.ID
where
YEAR(transactions.Time)=2015 and transactions.TransactionNumber='5526499'
and items.ItemLookupCode='806077P0001' and transactions.StoreID='2001'
在这里,用户可以搜索年份=2015,也可以不搜索。那么我该如何处理呢。当您不想根据年份搜索时,将日期参数传递给
NULL
,并在中添加或条件,其中@year
为NULL
declare @year INT=2015
select transactions.storeid as StoreID, MONTH(transactions.Time) Month,
transactionsEntry.TransactionNumber,transactionsEntry.Quantity,
items.ItemLookupCode,items.DepartmentID,items.CategoryID,items.SubDescription1,
suppliers.SupplierName,suppliers.Code
FROM [HQMatajer].[dbo].[Transaction] as transactions
RIGHT JOIN [HQMatajer].[dbo].[TransactionEntry] as transactionsEntry
ON transactions.TransactionNumber=transactionsEntry.TransactionNumber
INNER JOIN [HQMatajer].[dbo].[Item] as items
ON transactionsEntry.ItemID=items.ID
INNER JOIN [HQMatajer].[dbo].[Supplier] as suppliers
ON items.SupplierID=suppliers.ID
where
(YEAR(transactions.Time)=@year OR ISNULL(@year,'')='') and transactions.TransactionNumber='5526499'
and items.ItemLookupCode='806077P0001' and transactions.StoreID='2001'
如果年份不是硬编码的,则将其传递给@year
变量并在查询中使用
更新:
如果要将其与逗号分隔的字符串进行比较,请将@year
声明为varchar(100)
like
declare@year INT=2015
todeclare@year VARCHAR(100)='20142015'
然后更改where条件,如:
(CHARINDEX(','+CAST(YEAR(transactions.Time) as VARCHAR(4))+',',',' + @year + ',')>0
OR ISNULL(@year,'')='')
and transactions.TransactionNumber='5526499'
and items.ItemLookupCode='806077P0001' and transactions.StoreID='2001'
上述查询将检查交易年份。时间是否存在于@year中,并相应显示结果
注意:根据您的需要指定varchar的大小,这将产生更好的性能。您如何通过2015
?今天的提示:永远不要做右连接
,切换到左连接
。(大多数人觉得右连接方式太混乱。主表左连接可选数据
比可选数据右连接主表
更容易理解)如果是临时查询,那么您希望如何获取变量@year
?@Jibin,我必须在其中声明@year的值?@Rahul。变量似乎是OP问题的一个非常合理的解决方案。我不理解否决票。@GordonLinoff是的,但除非程序块I中存在的查询believe@mohamedfaisal在这种情况下,@year应该是varchar(100)
类型,您应该像20122013
一样传递它。然后在where子句中添加CHARINDEX(','+CAST(YEAR(transactions.Time)作为VARCHAR(4))+',',','+@YEAR+','))>0
。