这应该是一个简单的,但我没有找到任何解决方案:
正常的方法是使用这样的别名:
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'
答案 0 :(得分:2)
CASE WHEN hr_subject='' THEN code_name ELSE hr_subject END AS ac_subject
在UNION
query中,返回集中的列数,列名和数据类型由第一个行确定。所有追加的行必须与行类型匹配。附加行(包括别名)中的列名只是噪声而被忽略。也许对文档很有用,没有别的。
=
运算符不在SELECT
查询中分配任何内容。它是返回boolean
值的相等运算符。如果两个操作数相等,则TRUE
等。这将返回boolean
值:ac_subject='time'
因此您的错误消息:
UNION类型字符变化且布尔值无法匹配
分配"的唯一方法此查询中特定输出列的值是将其包含在SELECT
列表中的正确位置。
''
)与NULL
值混淆。在使用关系数据库执行任何 else之前需要了解的区别。 Maybe start here.在这种情况下,您宁愿使用COALESCE
为NULL
值提供默认值:
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的长度不同。这导致了不可预测的结果。我认为别名现在可以正常工作。
感谢您的支持。