SQL DB2查询语法问题

时间:2015-04-12 15:58:46

标签: sql select db2

我目前有一个表,我想用select语句修改。

我想选择一个空行并将其与另一个表合并,这可以在下面的代码中看到。

第一个select语句是错误的,因为它只需要为一行而不是所有这些语句执行此操作。或者以某种方式添加一个空行而不必向表中添加值

下面的代码也会抛出此错误:

SQL0420N在字符串参数中找到无效字符 功能“DECFLOAT”。 SQLSTATE = 22018

代码:

select ' ' as RD_E_SUP, \
       ' ' as RD_E_EMP, \
       ' ' as RD_QUOT   \
from RD_SUPERVISOR \
     \
UNION \
       \
select RD_E_SUP,  \
       RD_E_EMP,  \ 
      'null' as RD_QUOT  \ 
from RD_SUPERVISOR   \ 
ORDER BY RD_E_EMP 

1 个答案:

答案 0 :(得分:2)

您的第一个子查询未从表RD_SUPERVISOR中绘制任何内容,因此从该表中选择的唯一原因是 是否需要为表的每一行提供一个结果。假设您只需要一行而不管表RD_SUPERVISOR的内容,那么您可以选择一个特殊的表来实现此目的:

select ' ' as RD_E_SUP,
   ' ' as RD_E_EMP,
   ' ' as RD_QUOT
from SYSIBM.SYSDUMMY1

在其他一些DBMS中,您可以通过选择“DUAL”或完全省略FROM子句来达到相同的效果。

鉴于第一个子查询生成的行不能复制第二个子查询生成的行,UNION ALL将是比UNION更好的选择。如果要从第二个子查询的结果中删除重复项,则应在该子查询中使用SELECT DISTINCT

另请注意,' ''null'都与NULL不同。这不一定是个问题,但如果您的想法不同,那么您的查询并不意味着您的意思。

SQL0420N错误可能意味着DB2正在尝试(并且失败)将一个空字符串(' ')转换为类型DECFLOAT。如果它为整个结果的列RD_E_SUPRD_E_EMP选择了该类型,则可能会这样做,这可能是因为它是第二个子查询中该列的类型。要解决这个问题,您应该确保通过一个或两个选择列表中的显式类型转换,子查询选择的相应列的数据类型是相同的。