我正在从表中选择一个可以是整数或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答案的评论。它解释了为什么以及更好一点。感谢大家的想法。
答案 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)
答案 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)
只是添加一些关于无法在同一列中返回不同数据类型的其他注释...数据库列应该知道它们持有的数据类型。如果他们不那么那应该是一个大红旗,你在某处有设计问题,这几乎可以保证未来的头痛(比如这个)。