1

使用 Postgres,但如果有人知道如何在标准 SQL 中执行此操作,那将是一个很好的开始。我正在通过字符变化列加入表格。此列包含以下值:

PC11941.2004
PC14151.2004
PC21213.2003
SPC21434.2003
PC17715.04V1
PC18733.2002
0MRACCT_ALL.GLFUNCT

期间之后的许多数字对应于年份。我想通过本年度加入表格。因此,例如,我可以JOIN在条件LIKE '%2015'. 但我想创建这个视图并且永远不会返回它,所以我需要将它加入到类似(get_fy_part('YEAR', clock_timestamp()).

不知道我是怎么写的。我还没有成功。

4

3 回答 3

0

使用功能RIGHT()

SELECT originalColumn, RIGHT(originalColumn,4)
FROM table;

这将使您获得您感兴趣的年份。

如果您想要点之后的所有内容,则类似于:

SELECT originalColumn, RIGHT(originalColumn,len(originalColumn)-position('.' in originalColumn))
FROM table
于 2015-02-26T21:54:15.520 回答
0

取决于确切的规则 - 并实际实现CHECK了列的约束。

如果您的列中总是有一个点,col并且您的所有年份都有 4 位数字:

基本解决方案

SELECT * FROM tbl
WHERE  col LIKE to_char(now(), '"%."YYYY');

为什么?

与相同的数据类型进行比较是最有效的。由于该列是字符类型 ( varchar),因此请使用to_char()(returns text,实际上与varchar) 而不是EXTRACTdate_part()(return double precision)。

更重要的是,这个表达式是sargable。这通常是最便宜的,并且允许(可选)索引支持。在您的情况下,三元组索引将起作用:

优化

如果您想尽可能快(读取性能)和准确,并且您的表有很多行,请使用专门的部分表达式索引

CRATE INDEX tbl_year_idx ON tbl (cast(right(col, 4) AS int) DESC)
WHERE col ~ '\.\d{4}$';  -- ends with a dot and 4 digits

匹配查询:

SELECT * FROM tbl
WHERE  col ~ '\.\d{4}$'  -- repeat index condition
AND    right(col, 4)::int = EXTRACT(year FROM col);

用 测试性能EXPLAIN ANALYZE

您甚至可以更进一步,为当年定制指数:

CRATE INDEX tbl_year2015_idx ON tbl (tbl_id)  -- any (useful?) column
WHERE col LIKE '%.2015';

适用于第一个“基本”查询。
您必须(重新)为每年创建索引。一个简单的解决方案是提前几年创建索引,并每年自动添加另一个索引......

这也是您考虑替代方案的地方:将年份作为冗余integer存储在表中并简化其余部分。
这就是我会做的。

于 2015-02-26T22:43:09.357 回答
0

您可以使用 date_part('year', CURRENT_DATE) 获取当前年份

像这样的东西应该工作:

SELECT * FROM mytable WHERE mycolumn LIKE ('%' || date_part('year', CURRENT_DATE))

|| 运算符将百分号与年份连接起来。

我希望这会有所帮助!

于 2015-02-26T21:48:20.143 回答