2015-08-26 19 views
0

我想将unsigned int(0到65535)存储到smallint中。PostgreSQL函数在smallint中recort uint

我期望是这样的:

CAST(($1 - 32768) AS smallint) 

我的表有一栏

version smallint NOT NULL 

我该怎么做才能INSERT INTO mytable SET(1);,它会记录-32767 ,当我SELECT version from myTable;将返回1?

+0

SMALLINT应该能够采取值-32768至+32767每PostgreSQL文档..究竟你的表是什么样的,什么是你想实现什么? – ryekayo

+0

我想在查询中提供uint并在smallint中存储uint –

+0

为什么不使用'integer'并创建一个限制值的检查约束?这取决于表中其余的列,但我非常怀疑你会发现存储容量和性能有很大差异。 –

回答

0

您可以在表格顶部创建一个视图,该视图选择(version + 32768) as version(该视图的该列将是int类型,您也可以添加一个显式强制转换)。那么你应该查询这个视图而不是原始表来获取0-65535之间的值。

例子:现在

CREATE VIEW myTableView AS SELECT col1, col2, (version::int + 32768) as version FROM myTable; 

SELECT version FROM myTableView将0到65535

对于插入之间的返回值,你可以创建一个INSTEAD OF INSERT触发myTableView,这将插入(版本 - 32768):: SMALLINT进入myTable。这应该很容易,但我现在无法测试,因此我不提供示例。

+0

嘿非常好主意!我会尽快尝试。 谢谢Hedayat –