2011-12-01 86 views
1
SELECT 
    a.componentId, a.uniqueCode, 
    'sd'= CASE 
      WHEN RTRIM(LTRIM(b.name)) IS NULL OR RTRIM(LTRIM(b.uniqueCode)) IS NULL 
       THEN isnull(b.uniqueCode,'')+isnull(b.name,'') 
      WHEN RTRIM(LTRIM(b.name)) IS NULL AND RTRIM(LTRIM(b.uniqueCode)) IS NULL 
       THEN isnull(b.uniqueCode,'')+isnull(b.name,'') 
      ELSE b.uniqueCode + '(' + (b.name) + ')' 
    END, 
    a.specialization 
FROM Doctors a 
LEFT OUTER JOIN Territories b ON a.locationId = b.componentId; 

假设b.uniqueCode = T003b.name = Dhanmondi 01,然后sd应该是T003(Dhanmondi 01)SQL服务器:CASE不起作用

现在如果b.name = NULL那么SD应该是T003,但我的查询结果显示T003()

我的T-SQL查询出了什么问题?

+0

疯狂猜测:在转换到SQL-Server之前,您是否使用过Oracle? :) –

回答

3

你确定b.name是null?如果它有一个空字符串而不是null,你会看到你看到的结果。顺便说一句,rtrim/ltrim东西是完全没有必要与is null检查时,你的第二个when永远不会发生,因为如果任何一列是null你总是会在第一个when结束。

这将把空字符串为空:

SELECT a.componentId, a.uniqueCode, 'sd'= 
     CASE 
      WHEN nullif(b.name, '') IS NULL OR nullif(b.uniqueCode, '') IS NULL 
      THEN isnull(b.uniqueCode,'')+isnull(b.name,'') 
      ELSE b.uniqueCode + '(' + (b.name) + ')' 
     END , a.specialization 
FROM Doctors a LEFT OUTER JOIN Territories b ON a.locationId = b.componentId; 
+1

对于'NULLIF()',注意NULLIF(REPLICATE(CHAR(32),@n),'')'对于'@ n'的所有非负值都会产生NULL。 – onedaywhen

1

在SQL和所有流行的SQL产品 - 除了甲骨文 - 一个NULL和一个空字符串''是两回事。所以,你应该检查这两个选项:

SELECT a.componentId, a.uniqueCode, 
    CASE 
     WHEN b.name IS NULL OR b.name = '' 
      THEN COALESCE(b.uniqueCode, '') 
     WHEN b.uniqueCode IS NULL OR b.uniqueCode = '' 
      THEN b.name 
      ELSE b.uniqueCode + '(' + b.name + ')' 
    END AS sd 
    , a.specialization 
... 

或删除开头和结尾的空格:

CASE 
     WHEN b.name IS NULL OR RTRIM(LTRIM(b.name)) = '' 
      THEN COALESCE(RTRIM(LTRIM(b.uniqueCode)), '') 
     WHEN b.uniqueCode IS NULL OR RTRIM(LTRIM(b.uniqueCode)) = '' 
      THEN RTRIM(LTRIM(b.name)) 
      ELSE RTRIM(LTRIM(b.uniqueCode)) + '(' 
       + RTRIM(LTRIM(b.name)) + ')' 
    END AS sd 
+0

“在所有RDBMS中 - 除了Oracle ...” - 关系模型没有空值的概念。也许你的意思是,“在所有流行的SQL产品中 - 除了Oracle ...” – onedaywhen

+0

@onedaywhen:纠正,thnx。 –

+0

@onedaywhen:在某些情况下(特别是在该短语中),* RDBMS *可能不是* SQL产品*的同义词吗? (我不是想争辩,只是想为自己澄清一下。) –

2

让我们的一些基础知识了第一排序...

你的第二个WHEN是不可能的因为之前的WHEN将始终是true(或者为null)在第二个WHEN(均为null)之前。

RTRIM()LTRIM()将只返回NULL如果参数为NULL,所以这两个条件表达式是相同的:

  • RTRIM(LTRIM(b.name)) IS NULL
  • b.name IS NULL

卸下冗余代码,包括可达WHEN ,可以让你相当简化代码:

CASE 
    WHEN b.name IS NULL OR b.uniqueCode IS NULL 
     THEN isnull(b.uniqueCode,'') + isnull(b.name,'') 
    ELSE b.uniqueCode + '(' + b.name + ')' 
END 

现在我们可以读取它...

最有可能的解释是,b.name空白,不NULL