在VARCHAR列上创建INT索引

cclgggtu  于 2022-10-03  发布在  其他
关注(0)|答案(2)|浏览(143)

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

我将在这个项目中同时使用SQL Server和PostgreSQL。

wooyq4lh

wooyq4lh1#

PostgreSQL中,您可以创建函数索引("index on expression"),比创建冗余列占用更少的存储空间。

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

请记住,查询必须与表达式匹配才能使用这样的索引。喜欢:

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

(CAST作品和cast()的替代语法速记。)

当然,所有varchar值必须有效才能转换为int,如果是这样的话,更好的方法是从开始将类型更改为integer。在任何RDBMS中。

e0bqpujr

e0bqpujr2#

PostgreSQL:

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

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

**Fiddle:**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

相关问题