SQL强制转换和不同的列类型

SQL强制转换和不同的列类型,sql,db2,Sql,Db2,我的脑子都想不起来了。我需要在一个简单的IBMDB2表中运行COALESCE或CASE函数。我最初的做法是: select a.number, a.text, case when a.text <> '' then a.text else a.number end from MyTable a 我所能做到的最好的事情是: select a.number, a.text, case when cast(a.number as VARCHAR(20)) <> 0 then

我的脑子都想不起来了。我需要在一个简单的IBMDB2表中运行
COALESCE
CASE
函数。我最初的做法是:

select a.number, a.text, case when a.text <> '' then a.text else a.number end
from MyTable a
我所能做到的最好的事情是:

select a.number, a.text, case when cast(a.number as VARCHAR(20)) <> 0  then
cast(a.number as VARCHAR(20)) else a.text end from MyTable
在强制转换时选择a.number、a.text、case(a.number作为VARCHAR(20))0,然后
强制转换(a.number为VARCHAR(20)),否则a.text从MyTable结束
这既提供了数值,如果不可用,还提供了文本,但实际上,我正在寻找相反的方法


我是否在努力正确使用
CAST
函数?

问题在于不能从一列返回两种数据类型。所以它必须是VARCHAR或Numeric

下面应该解决你的问题

 select a.number, a.text, case when a.text <> '' then a.text else  cast(a.number as VARCHAR(20)) end from MyTable
选择a.number、a.text、case,当a.text“”然后a.text else cast(a.number as VARCHAR(20))从MyTable结束时

只是为了安全起见,修剪
文本
,并使用
coalesce()检查其长度。

如果不是
>0
,则将
number
转换为
varchar(20)


对于这样一个“奇怪”行,当a.text“”然后hex(a.text)或者a.number结束时,
的结果是什么?您的数据库是否启用了Oracle兼容模式?很遗憾,我不是DBA,所以不确定Oracle是否兼容。我知道DB2正在运行,仅此而已。至于你的建议,不幸的是a.text仍然是空白的。这比我的第一个选项向前迈进了一步,虽然它给了我所有的空白-如果a.text被填充,这个空白会被清除,但确实显示了a.number(如果a.text没有被填充),非常感谢,效果很好!看起来我有一些多余的代码。我很快会接受这个答案,但是我在实现这个方面有点困难。编辑:没关系-当我与另一列同时运行查询时(通过UNION ALL链接它们),我再次开始丢失a.text,但在另一列上运行CAST VARCHAR(20)后,它看起来很好。以下查询的结果是什么
选择a.number,a.text,case当a.text“”然后a.text else char(a.number)从表中结束(值(dec(1),“”),(dec(1),“*”),(dec(1),cast(null为varchar(1)))a(number,text)
我收到一条错误消息,我认为()有点不合适?另外,它不应该以as(number,text)结尾吗?这应该适用于db2forluw。您的Db2版本和平台是什么?
 select a.number, a.text, case when a.text <> '' then a.text else  cast(a.number as VARCHAR(20)) end from MyTable
select 
  a.number, a.text, 
  case 
    when coalesce(length(trim(a.text)), 0) > 0 then trim(a.text) 
    else cast(a.number as varchar(20))
  end 
from MyTable a