首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据sql server中列的不同值筛选数据

如何根据sql server中列的不同值筛选数据
EN

Stack Overflow用户
提问于 2018-08-02 11:46:07
回答 4查看 57关注 0票数 0

我被困在了一个点上。如果实体类型值是订舱或JOb,那么它将根据其基础进行筛选,但如果为空或空字符串(‘’),则希望它返回包含作业和预订的所有行

代码语言:javascript
复制
create proc spproc
 @entityType varchar(50)
 as 
 begin
 SELECT TOP 1000 [Id]
      ,[EntityId]
      ,[EntityType]
      ,[TenantId]
  FROM [FutureTrakProd].[dbo].[Activities]
where TenantId=1 and EntityType= case @EntityType when 'BOOKING' then 'BOOKING'                                   
                                    when 'JOB' then 'JOB'                                   
                                    END  
end

任何帮助都是值得赞赏的。

谢谢你

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-02 11:48:58

代码语言:javascript
复制
create proc spproc
 @entityType varchar(50)
 as 
 begin
 SELECT TOP 1000 [Id]
      ,[EntityId]
      ,[EntityType]
      ,[TenantId]
  FROM [FutureTrakProd].[dbo].[Activities]
where TenantId=1 and (@EntityType is null OR EntityType= @EntityType)
end
票数 4
EN

Stack Overflow用户

发布于 2018-08-02 11:49:20

不需要CASE表达式,只需要一个OR。以下几点应该使你走上正确的道路:

代码语言:javascript
复制
WHERE TenantId=1
  AND (EntityType = @EntityType OR @EntityType IS NULL)

另外,注意将参数声明为NULLable也是明智的:

代码语言:javascript
复制
CREATE PROC spproc @entityType varchar(50) = NULL

这意味着某人可以简单地排除参数值,而不是必须传递NULL (因此,EXEc spproc;可以工作)。

最后,如果您有大量的NULLable参数,那么您将看到一个“所有捕获”查询;如果是这样的话,解决方案就会有所不同。“捕获-所有”查询可能是众所周知的缓慢。

票数 3
EN

Stack Overflow用户

发布于 2018-08-02 11:49:20

您不需要使用case表达式,您可以:

代码语言:javascript
复制
SELECT TOP 1000 [Id], [EntityId], [EntityType], [TenantId]
from [FutureTrakProd].[dbo].[Activities]
WHERE TenantId = 1 AND
      (@EntityType IS NULL OR EntityType = @EntityType)
ORDER BY id; -- whatever order you want (asc/desc)

对于查询过程,您需要声明显式的ORDER BY子句,否则TOP 1000会给出随机的Id

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51652826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档