80
windows
淺談Greenplum的Boolean類型與Text類型之間的轉換
在Greenplum或者Deepgreen中,如果我們想直接把Boolean類型轉化為Text,那麼可能會讓你失望,因為他們不支持這種直接轉化,但是可以通過UDF的方式實現,下麵來簡單看一下這個過程。
首先,當我們運行下麵的SQL來轉換Boolean為Text類型時,會得到一個大寫測錯誤:-D
DECLARE qgis_4 BINARY CURSOR FOR SELECT st_asbinary("location",'NDR'),ctid,"start_datetime"::text,"end_datetime"::text,"temperature"::text,"pressure"::text,boolout("rainfall")::text,"humidity"::text,"illuminance"::text,"uva"::text,"ubv"::text FROM "event"."weather_soratena" WHERE "location" && st_makeenvelope(136.92967584819169247,37.11712946054284856,137.3367917387353998,37.52424535108657011,4326) AND st_intersects(st_curvetoline("location"),st_makeenvelope(136.92967584819169247,37.11712946054284856,137.3367917387353998,37.52424535108657011,4326))
ERROR: cannot cast type cstring to text
LINE 1: ...ture"::text,"pressure"::text,boolout("rainfall")::text,"humi...
錯誤的原因是GP不支持將cstring轉換成其他的數據類型(如下代碼顯示)
gpadmin=# select boolout('1')::text;
ERROR: cannot cast type cstring to text
LINE 1: select boolout('1')::text;
^
gpadmin=# select '1'::bool::text;
ERROR: cannot cast type boolean to text
LINE 1: select '1'::bool::text;
^
這時候我們該怎麼辦?放棄嗎?當然不,我們可以通過UDF(User Defined Function)的方式來變通實現。這裏我們定義一個BooleanToText函數,用來實現轉換功能:
postgres=# CREATE FUNCTION BooleanToText(boolean) RETURNS text STRICT IMMUTABLE LANGUAGE PLPGSQL AS $$ BEGIN IF $1 IS TRUE THEN RETURN 'true'; ELSE RETURN 'false'; END IF; END; $$;
CREATE FUNCTION
postgres=# CREATE CAST (Boolean AS Text) WITH FUNCTION BooleanToText(boolean);
CREATE CAST
postgres=# select '1'::bool::text;
text
------
true
(1 row)
有朋友說,你開頭的錯誤還是不能解決啊!姑且別急,接著看 ↓
針對cstring無法轉換成text的問題,我們可以使用boolin函數先將cstring轉換為boolean類型,然後在進行text的轉換:
## 無法直接轉換演示
postgres=# select boolout('1')::text;
ERROR: cannot cast type cstring to text
LINE 1: select boolout('1')::text;
## 可轉換方式演示
postgres=# select boolin(boolout('1'::bool))::text;
boolin
--------
true
(1 row)
End~
最後更新:2017-07-10 06:32:12