2016-04-07 5 views
0

Ich habe versucht, eine Spalte zu Integer-Typ mit den folgenden Abfrage Postgres zu ändern.Nicht in der Lage, Spalte zu Integer oder Boolean in Postgres zu ändern

alter table pm_user alter column testing2 type integer using testing2::integer; 

pm_user - Tabellenname
testing2 - Spaltenname

Die obige Säule würde jede Art von Datentyp zB sein: boolean, text, varchar (256).

Es gibt Fehler als 'Fehler: ungültige Eingabesyntax für Integer: "NULL"' Ich habe versucht, Lösungen wie unten basierend auf den vorherigen Abfragen auf dieser Website, aber es funktioniert nicht für mich.

alter table pm_user alter column testing2 type integer using (testing2::integer);         
alter table pm_user alter column testing2 type integer;    
alter table pm_user alter column testing2 type numeric using (testing2::numeric);   
alter table pm_user alter column testing2 type numeric (10,2); 

Was ist das eigentliche Problem? Wo es Punkte als Null eingeben? welcher wird als null genommen? Welche Lösung kann ich anbieten? Die gleiche Abfrage funktioniert, wenn ich versuche, als

alter table pm_user alter column testing2 type text using testing2::text; 
alter table pm_user alter column testing2 type varchar(256)using testing2::varchar(256); 

zu ändern. Es funktioniert auch nicht für boolean.

+0

Ich muss den Standardwert für Integer-Spalte als 0 nach dem Ändern von Datentyp auf Integer festlegen. Zu diesem Zweck habe ich die Abfrage "alter table pm_user alter column test2 set default 0;" Die obige Funktionalität wird benötigt, um den Datentyp der Spalte dynamisch über die Anwendung für die Anforderung zu ändern. –

Antwort

2

Die Fehlermeldung zeigt an, dass Ihre Spalte das Zeichenfolgenliteral 'NULL' anstelle eines "echten" Nullwerts enthält. Etwas wie folgt aus:

create table pm_user (testing2 varchar); 
insert into pm_user (testing2) values ('NULL'); 

(Beachten Sie die 'NULL' - das ist nicht das gleiche wie NULL)

So ist der Ausdruck, der den String in eine Zahl konvertieren muss sich darum kümmern.

Im Folgenden wird eine varchar-Spalte in Ganzzahl konvertiert. Jeder Wert in dieser Spalte, die keine richtige ganze Zahl ist, wird auf null geändert werden:

alter table pm_user alter column testing2 type integer 
    using case when testing2 ~ '^[-+0-9]+$' then testing2::integer else null end; 

~ ist Postgres' Operator für eine reguläre Ausdrücke. testing2 ~ '^[0-9]+$' testet, ob die Spalte nur Zahlen enthält.

+0

@muistooshort: guter Punkt, danke. –

+0

Diese Abfrage funktioniert, aber ich habe die Spalte überprüft und die Daten in der Spalte sind für alle Zeilen leer. Warum zeigt es dann 'null'? –

+0

Was kann ich für Boolean tun? Sollte ich wie in der vorherigen Abfrage auf false oder true setzen? –

Verwandte Themen