Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使where子句在Sql Server中成为可选的?_Sql_Sql Server_Stored Procedures - Fatal编程技术网

如何使where子句在Sql Server中成为可选的?

如何使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

我有一个类似用户将搜索记录的情况,他们将在where子句中给出条件。因此,他们可能会给出条件,也可能不会。那么在这个条件下如何进行查询

例如,用户可以搜索所有记录。有时,他们可能会搜索介于之间的日期。因此,如何查询日期的列字段是可选的

这是我的问题

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
to
declare@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