根据变量的类型在SQL中有条件地进行分支

时间:2009-03-30 13:52:23

标签: sql sql-server sql-server-2005 tsql

我正在从表中选择一个可以是整数或nvarchar的值。它存储为nvarchar。我想有条件地调用一个函数来转换这个值,如果它是一个整数(也就是说,如果它可以转换成一个整数),否则我想选择没有转换的nvarchar。

这是一个SQL Server 2005数据库。

select case
    when T.Value (is integer) then SomeConversionFunction(T.Value)
    else T.Value
end as SomeAlias

from SomeTable T

请注意,它是“(是整数)”部分,我遇到了麻烦。提前谢谢。

更新

检查Ian答案的评论。它解释了为什么以及更好一点。感谢大家的想法。

7 个答案:

答案 0 :(得分:4)

 select case
     when ISNUMERIC(T.Value) then T.Value 
     else SomeConversionFunction(T.Value)
 end as SomeAlias

另外,您是否考虑过使用sql_variant数据类型?

答案 1 :(得分:3)

结果集每个列只能有一个与之关联的类型,如果第一行转换为整数并且后面有字符串,则会出现错误:

Msg 245,Level 16,State 1,Line 1 将nvarchar值'word'转换为数据类型int时,转换失败。

试试看:

create table  testing
(
strangevalue   nvarchar(10)
)

insert into testing values (1)
insert into testing values ('word')
select * from  testing

select
    case
        when ISNUMERIC(strangevalue)=1 THEN CONVERT(int,strangevalue)
        ELSE strangevalue
     END
FROM testing

最好的办法是返回两列:

select
    case
        when ISNUMERIC(strangevalue)=1 THEN CONVERT(int,strangevalue)
        ELSE NULL
     END AS StrangvalueINT
    ,case
        when ISNUMERIC(strangevalue)=1 THEN NULL
        ELSE strangevalue
     END AS StrangvalueString
FROM testing

或您的应用程序可以测试数字并进行特殊处理。

答案 2 :(得分:2)

您不能拥有有时为整数且有时为字符串的列。返回字符串并使用客户端代码中的int.TryParse()进行检查。

答案 3 :(得分:2)

ISNUMERIC。但是,这接受+, - 和小数,因此需要更多的工作。

但是,您不能同时将列作为两种数据类型:您需要2列。

我建议您在客户端处理此问题或使用ISNUMERIC replacement

答案 4 :(得分:1)

IsNumeric会让你成为那里的一部分。然后,您可以添加一些其他代码来检查它是否为整数

例如:

select top 10 
    case 
        when isnumeric(mycolumn) = 1 then 
            case 
                when convert(int, mycolumn) = mycolumn then
                    'integer'
                else
                    'number but not an integer'
            end
        else 
            'not a number'
    end 
from mytable

答案 5 :(得分:1)

为了澄清其他一些答案,您的SQL语句不能在一列中返回不同的数据类型(看起来其他答案表示您不能在一列中存储不同的数据类型 - 您的所有都是strign表示)。

因此,如果您使用ISNUMERIC或其他函数,则如果选择了其他条带,则该值将被转换为表格中的字符串,无论如何都会返回该字符串。

如果您只选择一个值,那么它可以返回一个字符串或一个数字,但是您的前端代码需要能够返回不同的数据类型。

答案 6 :(得分:0)

只是添加一些关于无法在同一列中返回不同数据类型的其他注释...数据库列应该知道它们持有的数据类型。如果他们不那么那应该是一个大红旗,你在某处有设计问题,这几乎可以保证未来的头痛(比如这个)。