2010-05-21 36 views
6

Tamsayı olmam gereken Postgres veritabanımda Varchar türünde bir sütun var ... ve şimdi onları değiştirmek istiyorum, ne yazık ki bu görünmüyor raylarımın geçişini kullanarak çalışıyorum. Tablo sütunu başka bir veri türüne dönüştürme

ALTER TABLE table1 ALTER COLUMN columnB TYPE integer 

Yani bunu denedim:

execute 'ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)' 

ancak sütunun bazı boş çünkü dökme Bu durumda çalışmıyor çıkışına bu SQL görünüyor

change_column :table1, :columnB, :integer 

...

herhangi bir fikir?

Hata:

PGError: ERROR: invalid input syntax for integer: "" 
: ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER) 

Postgres v8.3

+0

hangi sürümünü çalıştırır

select columnB from table where not columnB ~ E'^[0-9]+$'; 

gibi bir şey bunu kontrol edebilirsiniz? Bu benim için – ealdent

+0

btw çalışır: göç ile tam olarak ne işe yaramaz? –

cevap

13

sorun Tablonuzdaki boş dizeleri olması gibi görünüyor. Aşağıdaki gibi muhtemelen bir case deyimiyle olanlar, işlemek gerekir:

execute %{ALTER TABLE "table1" ALTER COLUMN columnB TYPE integer USING CAST(CASE columnB WHEN '' THEN NULL ELSE columnB END AS INTEGER)}

Güncelleme: Tamamen güncellenmiş soruya dayanarak yeniden yazılmış.

+0

Alıntıları çıkardım ve birleştirmeyi kullanmayı denedim ancak yalnızca "PGError: ERROR: column" 0 "yok" – holden

2

BOŞ burada sorun olmamalı. Bize postgresql sürümünüzü ve hata iletinizi bildirin. Ayrıca, neden tanımlayıcılardan alıntı yapıyorsunuz? Kote olmayan tanımlayıcıların küçük harfe dönüştürüldüğünü (varsayılan davranış) unutmayın. Bu nedenle, sorgunuzda "columnB" ifadenizle ilgili bir sorun olabilir. İlk olarak, alıntıda dizine eklenmemiş olarak görünür.

Güncelleme: Bir sütunu tam sayıya dönüştürmeden önce, tüm değerlerin dönüştürülebilir olduğundan emin olmalısınız. Bu durumda, columnB'nin yalnızca rakam içermesi (veya boş) içermesi gerektiği anlamına gelir. Eğer boş dizeler tamsayılar NULL olarak dönüştürülmesini istiyorsanız Daha sonra kullandığınız Postgres'e ilk

UPDATE table set columnB = NULL WHERE columnB = ''; 
+0

Son postgresql sürümü 8.4.4 – leonbloy

+0

bozuk, 8.3 (postgresql83) ;-) – holden

İlgili konular