我有一个独特的设计,我需要将所有数据存储为VARCHAR
。我不能详细说明原因。我想将一些字段索引为不同的数据类型。这可能吗?如果是这样,会有任何陷阱吗?如果可能的话,这样做的语法是什么。
我将同时使用SQL Server和PostgresQL进行此项目。
答案 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以使用索引。