2017-10-10 6 views
1

integerフィールドで単純なUPDATEスクリプトを実行しようとしています。これにより、後続の2つの数値が「保持」され、先頭の数字が削除されます。たとえば、「0440」は「40」として更新されます。UPDATEステートメントw /整数フィールドの右の関数

UPDATE schema_name.table_name 
SET field_name = RIGHT(field_name::varchar, 2); 

:私のような、UPDATEスクリプトでこれと同じ機能を使用しようとすると、私は、このようなしかし

SELECT RIGHT(field_name::varchar, 2) 
FROM table_name; 

として、私はエラーに遭遇し、SELECT文で必要なデータを取得することができます私が受け取るエラーは:

の列を読み取ります。 。 。整数型ですが、式はテキスト型です。 。 。 ヒント:あなたはvarchar型に整数をキャストしているが、あなたが戻って整数に結果をキャストしていない表現

+0

を、 'FIELD_NAMEですあなたのテーブルに 'int'か' varchar'カラムがあるのでしょうか? –

+0

@ChrisJ:タイトルとエラーメッセージは 'integer'と言っています。(質問テキストは少し誤解を招いています) –

+1

問題はあまりにも明白です。明確にする価値がある –

答えて

0

を書き換えるか、キャストする必要があります。

UPDATE schema_name.table_name 
SET field_name = RIGHT(field_name::TEXT, 2)::INTEGER; 
0

エラーは非常に単純です - right戻りますが、整数列に割り当てることはできませんテキストデータ、。あなたは、しかし、それを明示的にキャストバックできます

UPDATE schema_name.table_name 
SET field_name = RIGHT(field_name::varchar, 2)::int; 
0

1(または数 - または文字列)で、「123」は(または文字列)です。

の値はの値には意味がありません。先頭に(意味のない)0は格納されていないためです。同じ整数値0000ための両方結果 - を意味 -

が厳密データ型integerに言えば「2つの番号末尾」を格納するために良くありません。しかし、私はそれがあなたが意味するものだとは思わない。数値上で動作するため

、前後にキャスティング必要とする(文字列関数を使用していないがmodulo operator %が正確に、あなたが必要なものを行います。field_name%100ので:。明確にするため

UPDATE schema_name.table_name 
SET field_name = field_name%100 
WHERE field_name > 99; -- to avoid empty updates 
関連する問題