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

正確なルールに依存し、実際CHECKに列に実装された制約。

列に常に 1 つのドットがcolあり、すべての年が 4 桁の場合:

基本的な解決策

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

なんで?

同じデータ型と比較するのが最も効率的です。列は文字型 ( varchar)であるため、または(return )よりもto_char()(returns text、実質的には) を使用します。varcharEXTRACTdate_part()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

関数を使用します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

date_part('year', CURRENT_DATE) で現在の年を取得できます

このようなものが動作するはずです:

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

|| 演算子は、パーセント記号と年を連結します。

それが役立つことを願っています!

于 2015-02-26T21:48:20.143 に答える