将案例值分配给列而不是别名

时间:2016-01-26 08:53:08

标签: sql postgresql union postgresql-9.1

这应该是一个简单的,但我没有找到任何解决方案:

正常的方法是使用这样的别名:

CASE WHEN ac_code='T' THEN 'time' ELSE 'purchase' END as alias

将别名与UNION ALL结合使用时会导致问题,因为别名的处理方式与其他列的处理方式不同。

使用别名分配值无效。它仍被视为别名,但它具有列名。

CASE WHEN ac_code='T' THEN 'time' ELSE 'purchase' END as ac_subject

我想根据条件为列分配值。

CASE WHEN ac_code='T' THEN ac_subject ='time' ELSE ac_subject='purchase' END

现在我收到错误消息

  

UNION类型字符变化且布尔值无法匹配

如何在不使用列中的别名(由UNION中的其他列共享)的情况下为case语句中的列分配值?

以下是整个(简化)查询:

SELECT hr_id, 
CASE WHEN hr_subject='' THEN code_name ELSE hr_subject END
FROM hr
LEFT JOIN code ON code_id=hr_code 
WHERE hr_job='123'

UNION ALL 
SELECT po_id,
CASE WHEN po_subject='' THEN code_name ELSE po_subject END
FROM po
LEFT JOIN code ON code_id=po_code
WHERE po_job='123' 

UNION ALL
SELECT ac_id,
CASE WHEN ac_code='T' THEN ac_subject='time' ELSE ac_subject='purchase' END
FROM ac
WHERE ac_job='123'

3 个答案:

答案 0 :(得分:2)

  1. 您提供的查询中没有别名。你的条款令人困惑。这将是column alias
  2. CASE WHEN hr_subject='' THEN code_name ELSE hr_subject END AS ac_subject
    1. UNION query中,返回集中的列数,列名和数据类型由第一个行确定。所有追加的行必须与行类型匹配。附加行(包括别名)中的列名只是噪声而被忽略。也许对文档很有用,没有别的。

    2. =运算符SELECT查询中分配任何内容。它是返回boolean值的相等运算符。如果两个操作数相等,则TRUE等。这将返回boolean值:ac_subject='time'因此您的错误消息:

    3.   

      UNION类型字符变化且布尔值无法匹配

      分配"的唯一方法此查询中特定输出列的值是将其包含在SELECT列表中的正确位置。

      1. 问题中的信息不完整,但我怀疑您还将空字符串('')与NULL值混淆。在使用关系数据库执行任何 else之前需要了解的区别。 Maybe start here.在这种情况下,您宁愿使用COALESCENULL值提供默认值:
      2. SELECT hr_id, COALESCE(hr_subject, code_name) AS ac_subject
        FROM   hr
        LEFT   JOIN code ON code_id=hr_code 
        WHERE  hr_job = '123' 
        
        UNION ALL 
        SELECT po_id, COALESCE(po_subject, code_name)
        FROM   po
        LEFT   JOIN code ON code_id=po_code
        WHERE  po_job = '123'
        
        UNION ALL
        SELECT ac_id, CASE WHEN ac_code = 'T' THEN 'time'::varchar ELSE 'purchase' END
        FROM   ac
        WHERE  ac_job = '123'
        

        只是一个有根据的猜测,假设类型为varchar。您应该为列名添加表限定以阐明其来源。或表定义以澄清一切。

答案 1 :(得分:0)

CASE表达式应该返回一个值,例如'时间'

您的值是另一个表达式subject ='time',它是一个布尔值(true或false)。

这是故意的吗?你用UNION粘合的其他查询在那个地方也有一个布尔值吗?可能不是,这就是DBMS所抱怨的。

答案 2 :(得分:-3)

我发现了问题。

angular.module('App',[])
.directive('myT',[function(){
    return {
        restrict: 'A',
        replace : true,
        transclude : true,
        template : '<div><div ng-transclude></div></div>',
        controller : 'listCtrl'
    };
}])
.controller('listCtrl', ['$scope', function($scope){
    $scope.List = [
        {Name: 'a'},{Name: 'b'}
    ];
}]);

列code_name和hr_subject的长度不同。这导致了不可预测的结果。我认为别名现在可以正常工作。

感谢您的支持。