首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQL中用ISNULL函数替换以下查询?

如何在SQL中用ISNULL函数替换以下查询?
EN

Database Administration用户
提问于 2015-04-16 11:52:37
回答 2查看 536关注 0票数 0

我有以下查询。出于性能优化的原因,我被要求用SQL中的ISNULL函数替换逻辑。我怎样才能做到这一点?请指点。

代码语言:javascript
复制
                   SELECT CASE 
                               WHEN tb1.[tag-value] IS NOT NULL THEN tb1.[tag-value]
                               ELSE 'N/A'
                          END     AS [tag-value]
                   FROM   @AgentTableFilt ta
EN

回答 2

Database Administration用户

回答已采纳

发布于 2015-04-16 11:55:08

这应该能满足你的需要

代码语言:javascript
复制
SELECT ISNULL(ta.[tag-value], 'N/A') AS [tag-value]

FROM   @AgentTableFilt ta

或者您可以使用以下方法

代码语言:javascript
复制
SELECT COALESCE(ta.[tag-value], 'N/A') AS [tag-value]

FROM   @AgentTableFilt ta
票数 5
EN

Database Administration用户

发布于 2015-04-16 12:43:18

CASE相比,我不认为任何这些建议都是性能上的特别改进,因为这已经是非常基本的了。

另一种可能的选择(尽管同样不值得,因为这只是编写您的CASE的一种简短的方式)用于Server 2012及以上。

如果您实现了这一点,那么我想看看要求您优化CASE的人的反应是什么,因为应该没有任何区别。

代码语言:javascript
复制
SELECT IIF(ta.[tag-value] IS NULL, 'N/A', ta.[tag-value]) AS [tag-value]
FROM   @AgentTableFilt ta

我通过测试 @Martin在他的评论中进行了链接(并为IIF添加了我自己的),结果与其他选项大致相同(如果不是稍快的话)。不过,它的可读性可能稍差一些,因此它取决于您对逻辑的熟悉程度。

当然,您应该在您自己的数据上测试这一点,因为对您的服务器最优的可能不是对其他服务器最优的。

代码语言:javascript
复制
DECLARE @i INT 
SET @i = 1
DECLARE @CPU INT 
SET @CPU = @@CPU_BUSY
DECLARE @StartDate DATETIME 
SET @StartDate = GETDATE()

WHILE @i <= 1000000
BEGIN   
  IF COALESCE('abc', 'def') = 'def'     
      PRINT 1   
  SET @i = @i + 1
END
PRINT 'COALESCE, both non-null'
PRINT 'Total CPU time: ' + CONVERT(varchar, @@CPU_BUSY - @CPU)
PRINT 'Total milliseconds: ' + CONVERT(varchar, DATEDIFF(ms, @StartDate, GETDATE()))
PRINT ''
GO

DECLARE @i INT SET @i = 1
DECLARE @CPU INT SET @CPU = @@CPU_BUSY
DECLARE @StartDate DATETIME SET @StartDate = GETDATE()

WHILE @i <= 1000000
BEGIN   
  IF ISNULL('abc', 'def') = 'def'       
    PRINT 1 
  SET @i = @i + 1
END
PRINT 'ISNULL, both non-null'
PRINT 'Total CPU time: ' + CONVERT(varchar, @@CPU_BUSY - @CPU)
PRINT 'Total milliseconds: ' + CONVERT(varchar, DATEDIFF(ms, @StartDate, GETDATE()))
PRINT ''
GO

DECLARE @i INT SET @i = 1
DECLARE @CPU INT SET @CPU = @@CPU_BUSY
DECLARE @StartDate DATETIME SET @StartDate = GETDATE()

WHILE @i <= 1000000
BEGIN   
  IF IIF('def' IS NULL, 'abc', 'def' ) = 'abc'
        PRINT 1 
  SET @i = @i + 1
END


PRINT 'IIF, both non-null'
PRINT 'Total CPU time: ' + CONVERT(varchar, @@CPU_BUSY - @CPU)
PRINT 'Total milliseconds: ' + CONVERT(varchar, DATEDIFF(ms, @StartDate, GETDATE()))PRINT ''
GO

合并,都是非空的

总CPU时间: 22

总毫秒: 810

ISNULL,均为非空

总CPU时间: 37

总毫秒: 910

IIF,均为非空

总CPU时间: 21

总毫秒: 783

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

https://dba.stackexchange.com/questions/98025

复制
相关文章

相似问题

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