Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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
sql where子句仅在case when时包含_Sql_Case_Where - Fatal编程技术网

sql where子句仅在case when时包含

sql where子句仅在case when时包含,sql,case,where,Sql,Case,Where,我想知道是否可以为多个客户端运行一个脚本,在为指定的客户端运行时可以添加额外的where子句,而不必多次重写基本脚本 基本脚本是 SELECT Status, count(distinct T1.AccountNo) FROM Orders (nolock), Accounts (NOLOCK) WHERE Orders.AccountNo = Accounts .AccountNo AND date between '1 Oct 2011' and '31 Oct 2011' GROUP

我想知道是否可以为多个客户端运行一个脚本,在为指定的客户端运行时可以添加额外的where子句,而不必多次重写基本脚本

基本脚本是

SELECT Status, count(distinct T1.AccountNo)
FROM Orders (nolock), Accounts (NOLOCK)
WHERE Orders.AccountNo = Accounts .AccountNo  
AND date between '1 Oct 2011' and '31 Oct 2011'
GROUP BY Status
但是当我为客户机A运行时,我希望包括额外的标准

AND Accounts.Role IN ('User','Admin')
AND Accounts.Active= 'Y'

在SQL Server上,可以按如下方式使用主机名()

SELECT Status, count(distinct T1.AccountNo)
FROM Orders (nolock), Accounts (NOLOCK)
WHERE Orders.AccountNo = Accounts .AccountNo  
AND date between '1 Oct 2011' and '31 Oct 2011'
AND ((HOST_NAME() <> 'ClientA') OR (Accounts.Role IN ('User') AND Accounts.Active= 'Y'))
GROUP BY Status
选择状态、计数(不同的T1.AccountNo)
来自订单(nolock)、账户(nolock)
其中Orders.AccountNo=Accounts.AccountNo
日期介于“2011年10月1日”和“2011年10月31日”之间
和((HOST_NAME()'ClientA')或(Accounts.Role IN('User')和Accounts.Active='Y'))
按身份分组

当不需要参数时,您会在存储过程中经常看到这一点:

SELECT *
FROM SomeTable
WHERE ((@myvariable IS NULL OR @myvariable = mycolumn))
不幸的是,这通常会导致扫描,因为它可能会短路,也可能不会短路

我要发布的另一个例子与德里克·克罗姆的相同


最后,您可以使用-人们要么喜欢它,要么讨厌它。

我的假设是我们正在谈论SQL Server。您好,我刚刚更新了“和帐户中的角色('User')”的脚本,并将其更改为“和帐户中的角色('User','Admin')”。我是不是要换个位子。。。ELSE'User','Admin'以('User','Admin')结尾?嗨,我刚试过,但它没有考虑“额外”标准。当Client='A'时,我希望它按Accounts.Role和Account.Active进行筛选。但是在提供的脚本中,当Client='A'然后是All Accounts.Roles,否则就只是Accounts.Role in('User')时,它不是这样读的吗?我希望它是另一种方式。然后是Accounts.Role in('User','Admin')ELSE Accounts.Role END???不,我写的方式是正确的。如果客户端是,它将检查Accounts.Role是否在“User”中,否则它将检查User是否在User中(即始终为true)。对于您最初的评论,您只需更改其中的部分。我将在中编辑它。
SELECT *
FROM SomeTable
WHERE ((@myvariable IS NULL OR @myvariable = mycolumn))