[英]Assign a case value to a column rather than an alias
这应该是一个简单的方法,但是我没有找到任何解决方案:
正常方法是使用这样的别名:
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语句中为列分配值而不使用列中的别名(由UNION
的其他列共享)?
这是整个(简化的)查询:
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'
CASE WHEN hr_subject='' THEN code_name ELSE hr_subject END AS ac_subject
在UNION
查询中 ,返回集中的列数,列名和数据类型由第一行确定。 所有附加的行必须与行类型匹配。 附加行中的列名(包括别名)只是杂乱无章而被忽略。 也许对文档有用,别无其他。
=
运算符在SELECT
查询中不分配任何内容。 等于运算符返回boolean
值。 如果两个操作数相等,则为TRUE
,等等。这将返回boolean
值: ac_subject='time'
因此,您的错误消息为:
UNION类型的字符变化和布尔值无法匹配
在此查询中将值“分配”到特定输出列的唯一方法是将其包括在SELECT
列表中的正确位置。
''
)与NULL
值。 在对关系数据库执行其他任何操作之前,您需要了解的区别。 也许从这里开始。 在这种情况下,您宁愿使用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
,这只是一个有根据的猜测。 您应该在表名中添加表限定符,以阐明其来源。 或使用表定义来澄清所有内容。
CASE表达式应该返回一个值,例如'time'。
您的值是另一个表达式subject ='time'
,它是一个布尔值(对或错)。
这是故意的吗? 您用UNION粘合的其他查询在该位置也有布尔值吗? 可能不是,这就是DBMS抱怨的。
我发现了问题。
CASE WHEN hr_subject=’’ THEN code_name ELSE hr_subject END
列code_name和hr_subject的长度不同。 这导致了不可预测的结果。 我认为别名现在可以使用。
谢谢您的支持。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.