将 case 值分配给列而不是别名

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 types character varying and boolean cannot be matched

如何在不使用列中的别名的情况下为 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 表达式应该 return 一个值,例如'time'.

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

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

我发现了问题。

CASE WHEN hr_subject=’’ THEN code_name ELSE hr_subject END 

列 code_name 和 hr_subject 的长度不同。这导致了不可预知的结果。我认为别名现在可以使用了。

感谢您的支持。

  1. 您提供的查询中没有别名。你在混淆术语。这将是 column alias:
CASE WHEN hr_subject='' THEN code_name ELSE hr_subject END <b>AS ac_subject</b>
  1. UNION query中,返回集中的列数、列名和数据类型由行决定。所有附加的行都必须匹配行类型。附加行中的列名(包括别名)只是噪音并被忽略。也许对文档有用,没有别的。

  2. = 运算符 分配SELECT 查询中的任何内容。 returns 是 boolean 值的相等运算符。 TRUE 如果两个操作数相等,等等。这个 returns 一个 boolean 值:ac_subject='time' 因此你的错误信息:

UNION types character varying and boolean cannot be matched

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

  1. 问题中的信息不完整,但我怀疑您也将空字符串 ('') 与 NULL 值混淆了。在对关系数据库进行 anything 之前,您需要了解一个区别。 Maybe start here. In this case you would rather use 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。您应该在列名称中添加 table 限定以阐明它们的来源。或 table 定义来澄清一切。