繁体   English   中英

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

[英]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'
  1. 您显示的查询中没有别名。 您对条款感到困惑。 这将是列别名
CASE WHEN hr_subject='' THEN code_name ELSE hr_subject END AS ac_subject
  1. UNION查询中 ,返回集中的列数,列名和数据类型由第一行确定。 所有附加的行必须与行类型匹配。 附加行中的列名(包括别名)只是杂乱无章而被忽略。 也许对文档有用,别无其他。

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

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

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

  1. 在问题中的信息是不完整的,但我怀疑你也混淆了空字符串( '' )与NULL值。 在对关系数据库执行其他任何操作之前,您需要了解的区别。 也许从这里开始。 在这种情况下,您宁愿使用COALESCENULL值提供默认值:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM