Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将大小写值指定给列而不是别名_Sql_Postgresql_Union_Postgresql 9.1 - Fatal编程技术网

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'