将 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 的长度不同。这导致了不可预知的结果。我认为别名现在可以使用了。
感谢您的支持。
- 您提供的查询中没有别名。你在混淆术语。这将是 column alias:
CASE WHEN hr_subject='' THEN code_name ELSE hr_subject END <b>AS ac_subject</b>
在UNION
query中,返回集中的列数、列名和数据类型由第行决定。所有附加的行都必须匹配行类型。附加行中的列名(包括别名)只是噪音并被忽略。也许对文档有用,没有别的。
=
运算符不 分配SELECT
查询中的任何内容。 returns 是 boolean
值的相等运算符。 TRUE
如果两个操作数相等,等等。这个 returns 一个 boolean
值:ac_subject='time'
因此你的错误信息:
UNION types character varying and boolean cannot be matched
在此查询中将值 "assign" 到特定输出列的唯一方法是将其包含在 SELECT
列表中的正确位置。
- 问题中的信息不完整,但我怀疑您也将空字符串 (
''
) 与 NULL
值混淆了。在对关系数据库进行 anything 之前,您需要了解一个区别。 Maybe start here. In this case you would rather use 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
。您应该在列名称中添加 table 限定以阐明它们的来源。或 table 定义来澄清一切。
这应该是一个简单的,但我还没有找到任何解决方案:
通常的方法是使用这样的别名:
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 的长度不同。这导致了不可预知的结果。我认为别名现在可以使用了。
感谢您的支持。
- 您提供的查询中没有别名。你在混淆术语。这将是 column alias:
CASE WHEN hr_subject='' THEN code_name ELSE hr_subject END <b>AS ac_subject</b>
在
UNION
query中,返回集中的列数、列名和数据类型由第行决定。所有附加的行都必须匹配行类型。附加行中的列名(包括别名)只是噪音并被忽略。也许对文档有用,没有别的。=
运算符不 分配SELECT
查询中的任何内容。 returns 是boolean
值的相等运算符。TRUE
如果两个操作数相等,等等。这个 returns 一个boolean
值:ac_subject='time'
因此你的错误信息:
UNION types character varying and boolean cannot be matched
在此查询中将值 "assign" 到特定输出列的唯一方法是将其包含在 SELECT
列表中的正确位置。
- 问题中的信息不完整,但我怀疑您也将空字符串 (
''
) 与NULL
值混淆了。在对关系数据库进行 anything 之前,您需要了解一个区别。 Maybe start here. In this case you would rather useCOALESCE
为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
。您应该在列名称中添加 table 限定以阐明它们的来源。或 table 定义来澄清一切。