Sql 将大小写值指定给列而不是别名
这应该是一个简单的问题,但我没有找到任何解决方案: 通常的方法是使用如下别名:Sql 将大小写值指定给列而不是别名,sql,postgresql,union,postgresql-9.1,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 '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
中的其他列共享)的情况下为case语句中的列赋值
以下是整个(简化)查询:
CASE表达式应该返回一个值,例如“time” 您的值是另一个布尔值表达式
subject='time'
这是故意的吗?与UNION粘合的另一个查询在该位置也有布尔值吗?可能不是,这就是DBMS所抱怨的。我发现了问题所在
CASE WHEN hr_subject=’’ THEN code_name ELSE hr_subject END
code_name和hr_subject列的长度不同。这导致了不可预测的结果。我认为别名现在可以用了
谢谢你的支持
只是一个有根据的猜测,假设type
varchar
。您应该在列名中添加表限定以澄清其来源。或表定义来澄清一切。请编辑您的问题并添加完整的查询。案例
表达式的返回数据类型必须匹配!联合
的返回数据类型也必须如此。请共享您的整个查询,您可能试图联合不匹配的列,但我们看不到。您的编辑显示我的答案是正确的;前两个查询选择一个ID加一个字符串,而第三个查询选择一个ID和一个布尔值。这不匹配,因此不能对这三个查询使用UNION ALL。不过,我不明白您实际上打算在这里做什么。@sibert:如果不是有意的,那么为什么不修复它呢?是的,但是“分配”“时间”“到主题列”的语法如何?您的结果中没有“主题”列。有第一列和第二列。第一个是ID,第二个是字符串。如果希望此字符串在第三次查询中为'time'或'purchase',则将此然后为'time'或'purchase'结束
。您可以在案例之后添加作为主题
。。。在第一个查询中结束
,将第二列称为“主题”。这是第一个在UNION[ALL]查询中给出列名的查询。(因此,在第一个查询中,您可能还希望在hr\u id
之后添加as id
。)我不明白。ac_受试者
在这里应该如何参与?它是表ac
中的一列,对吗?所以当ac_code
时,该表中的另一列等于'T'您希望得到的字符串是什么时间'?那么,这与ac_subject
有什么关系呢?对于UNION ALL,您永远不需要虚拟列;你似乎并不完全理解这个概念。至于您的请求:当ac_code='T'然后'time'或者'purchase'结束时,案例是否对您有效?如果不是:您得到的结果与您想要得到的结果有何不同?这当然不能解释您得到的错误消息。这并不能解释你的另一个问题是什么,或者你认为是什么问题。我现在完全理解我的错误。我很感谢你的回答。我想指出一个事实,即所有列必须具有完全相同的长度和类型,才能获得所需的结果。非常感谢。
CASE WHEN hr_subject=’’ THEN code_name ELSE hr_subject END
CASE WHEN hr_subject='' THEN code_name ELSE hr_subject END AS ac_subject
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'