执行查询时,表达式必须具有相同的数据类型错误

时间:2017-11-15 18:02:49

标签: sql oracle

需要你的帮助来解决我得到的错误。我正在使用联合加入两个查询并给我一个错误。以下是查询以及错误消息。

查询:

SELECT 'Firewall Rules' as Platform
       , 'TestCount' TestCount
       , 'TestPassCount' TestPassCount
       , percentage as percentage
       , firewall_name as Server 
from(
    SELECT round(avg(replace(PER_OF_VIOLATING_RULES, '%', ''))* 1 , 2)||'%'  as percentage
           , firewall_name
    from table1 
    group by firewall_name
)
union
select 'Database' as Platform
       , count( *) TestCount
       , count(case when result_status = 'Not A Finding' then 1 end) TestPassCount
       , Round(  count(case when result_status = 'Not A Finding' then 1 end) / count(*) * 100 , 2) percentage
       , asset as Server
FROM table2 
group by asset

错误消息:

ORA-01790: expression must have the same datatype as corresponding expression
01790. 00000 -  "expression must have the same datatype as the corresponding expression"
*Cause:    
*Action:
Error at Line: 1 Column: 37

有人可以帮忙修改查询吗?

2 个答案:

答案 0 :(得分:2)

使用set操作,所有子查询的投影必须具有相同的签名。因此列的数据类型必须匹配。

使用您的顶级子查询,您将返回TestCountTestPassCount的字符串文字,但返回底部子查询的数字。所以你需要改变其中一个预测。您可以使用to_char()将数字转换为字符串,但最好删除防火墙子查询中的字符串文字:

SELECT 'Firewall Rules' as Platform
       , to_number(null) TestCount
       , to_number(null) TestPassCount
       , percentage as percentage
....

或者你可以使用文字零,这取决于你的需要。

顺便说一下:你可以使用UNION ALL而不是UNION,因为由于platform字面值,两个子查询的结果集都保证是一个集合。 UNION做了一个确保唯一性的排序,因此对于一个大的查询,UNION ALL更有效。

答案 1 :(得分:0)

'TestCount' TestCountTestPassCount' TestPassCount在第一个查询中是字符串,您在第二个查询中为相应字段提取数值。

您可以typecast在第二个查询中使用TO_CHAR功能来解决此问题。