数据中的SQL辅助标头

问题描述 投票:1回答:2

我有一个问题,我没有找到答案。我编写了一个SQL查询来生成一个运行良好的报表,并主要输出数字字段。我遇到的问题是我们将它放入一个通过电子邮件发送文件的程序,它只能通过电子邮件发送不包含标题行的.csv。

有没有办法将标题输入数据?我在这里发现了一些对我不起作用的解决方案。似乎无论我做什么,我都会收到数据类型错误。这完全在Oracle数据库中,我们用来发送数据的程序称为IQAlert,它是IQMS的一部分,它是一个制造/ erp系统。

到目前为止,我已经尝试将标题转换为一些数字字段,我在这里和互联网上的其他地方找到了许多其他解决方案,例如更改为varchar的标题。我目前得到的错误是

“ORA-01790:表达式必须与对应的表达式具有相同的数据类型”

这是一个极其解析的代码示例。添加标题“itemno”工作正常,因为该字段是文本,当我尝试添加标题时,我得到上面引用的数据类型错误。

select 'itemno' as itemno, 'OnHand' as OnHand
from iqms.arinvt

union

select  arinvt.itemno, arinvt.onhand
from iqms.arinvt

where itemno='10-00000000'
sql oracle
2个回答
0
投票

根据有关The UNION [ALL], INTERSECT, MINUS Operators的文件

您可以使用集合运算符UNION,UNION ALL,INTERSECT和MINUS组合多个查询。所有集合运算符具有相同的优先级。如果SQL语句包含多个集合运算符,则Oracle数据库将从左到右对它们进行求值,除非括号明确指定另一个顺序。

复合查询的组件查询的选择列表中的相应表达式必须在数量上匹配,并且必须位于相同的数据类型组(例如数字或字符)中。

如果组件查询选择字符数据,则返回值的数据类型确定如下:

  • 如果两个查询都选择相等长度的数据类型CHAR的值,则返回的值具有该长度的数据类型CHAR。如果查询选择具有不同长度的CHAR值,则返回的值为VARCHAR2,其长度为较大的CHAR值。
  • 如果其中一个或两个查询选择数据类型VARCHAR2的值,则返回的值具有数据类型VARCHAR2。

如果组件查询选择数字数据,则返回值的数据类型由数字优先级确定:

  • 如果任何查询选择BINARY_DOUBLE类型的值,则返回的值具有数据类型BINARY_DOUBLE。
  • 如果没有查询选择BINARY_DOUBLE类型的值,但任何查询选择BINARY_FLOAT类型的值,则返回的值具有数据类型BINARY_FLOAT。
  • 如果所有查询都选择NUMBER类型的值,则返回的值的数据类型为NUMBER。

在使用set运算符的查询中,Oracle不会跨数据类型组执行隐式转换。因此,如果组件查询的相应表达式同时解析为字符数据和数字数据,则Oracle会返回错误。


简而言之:在使用其中一个SET运算符的查询中,例如:

SELECT x FROM table
UNION
SELECT y FROM table

其中x是数值数据类型,y是字符数据类型(反之亦然),那么Oracle不会跨数据类型组执行隐式转换并返回错误 两个简单的例子:

SELECT 1 as X FROM dual
UNION
SELECT 'John' as Y FROM dual

ORA-01790: expression must have same datatype as corresponding expression

SELECT 'John' as X FROM dual
UNION ALL
SELECT 123 as Y FROM dual;

ORA-01790: expression must have same datatype as corresponding expression

由于Oracle不执行隐式转换,因此必须将一种数据类型显式转换为另一种数据类型,最简单的方法是使用TO_CHAR转换函数将数字转换为字符串,如下例所示:

SELECT 'John' as X FROM dual
UNION ALL
SELECT to_char(123) as Y FROM dual;

X   
----
John
123

0
投票

也许这会有所帮助。第一个数字只是序列,可以使用ROWNUM或ROW_NUMBER()代替。其余数字是模拟值:

SELECT itemno, onhand FROM
 (
  select 1 row_seq, NULL itemno, to_number(null) onhand from dual
  union all
  select 2, '5', 6 from dual
  union all
  select 3, '7', 8 from dual
 )
WHERE row_seq > 1
/

输出:

ITEMNO  ONHAND
5            6
7            8
© www.soinside.com 2019 - 2024. All rights reserved.