我应该使用哪种SQL数据类型来存储数字和字符串并进行比较?

时间:2019-01-23 14:14:27

标签: sql sql-server

SQL Server中有一个表,该表应包含具有以下值的列vtkScalarsToColors

  • 1998
  • 1700
  • 中年
  • 1493
  • 石器时代

我想查询

discovery_time

推荐使用哪种数据类型?

2 个答案:

答案 0 :(得分:0)

与VarChar()一起使用:

Create Table #tbl
(
val VarChar(15)
)
Insert into #tbl Values
('1998'),
('1700'),
('Middle Age'),
('1493'),
('Stone Age')

查询

With cte As
(
Select 
   *,
   CASE WHEN TRY_CONVERT(Int, val) IS Not NULL Then val End As yr
From #tbl
)
Select val From cte Where yr >  1800

更新:这也将起作用。

Select *  From #tbl
Where  Try_Convert(Int, val) > 1800

结果

val
1998

答案 1 :(得分:0)

好吧,显然您不能在数字列中存储字符串值,因此需要一个字符串。

一种方法是更改​​逻辑,更像是:

WHERE discovery_time > '1800' and discovery_time < '9999'

然后确保所有字符串都填充为零。因此,请选择“ 0500”而不是“ 500”。这不适用于BC。

另一种方法是隐藏变量。这是一种方法:

create table . . . (
    discovery_year int,              -- a year
    discovery_period varchar(255),   -- a period
    discovery_time as (coalesce(discovery_period, cast(discovery_year as varchar(255))
);

然后对discovery_year执行逻辑。

实际上,另一种方法是try_convert()

WHERE TRY_CONVERT(int, discovery_time) > 1800 

您也可以将其添加为计算列:

alter table t add discovery_year as (try_convert(int, discovery_time));

您只需要记住在比较中使用discovery_year