在VARCHAR列上创建INT索引

时间:2014-08-24 18:08:58

标签: sql sql-server postgresql casting indexing

我有一个独特的设计,我需要将所有数据存储为VARCHAR。我不能详细说明原因。我想将一些字段索引为不同的数据类型。这可能吗?如果是这样,会有任何陷阱吗?如果可能的话,这样做的语法是什么。

我将同时使用SQL Server和PostgresQL进行此项目。

2 个答案:

答案 0 :(得分:1)

PostgreSQL 中,您可以创建功能索引("index on expression"),这比创建冗余列更有效。

CREATE INDEX tbl_intasvarchar_idx ON tbl (cast(intasvarchar AS int));

请记住,查询必须与表达式匹配才允许使用此类索引。像:

SELECT *
FROM   tbl
WHERE  intasvarchar::int = 123;

(演员作品的替代语法简写以及cast()。)

当然,所有varchar值必须准备好投射到int,如果是这样的话,优越方法就是保存integer开始以即可。在任何 RDBMS。

答案 1 :(得分:0)

<强>的PostgreSQL:

创建一个基于函数的索引,如下所示:

create index int_index on tbl (cast(cast(num_as_string as decimal) as integer));

小提琴: http://sqlfiddle.com/#!15/d0f46/1/0

稍后,当您运行查询时:

select *
from tbl
where cast(cast(num_as_string as decimal) as integer) = 12

将使用索引,因为索引是应用于列的函数的结果,而不是列本身。

SQL Server:

在SQL Server中,您可以添加计算列和计算列的索引,如下所示:

create table tbl (num_as_string varchar(10));

insert into tbl (num_as_string) values ('12.3');

alter table tbl add num_as_string_int as cast(cast(num_as_string as decimal) as integer);

create index int_index on tbl (num_as_string_int);

然后查询num_as_string_int以使用索引。

小提琴: http://sqlfiddle.com/#!6/1f378/2/0