2010-09-30 40 views
17

我要檢查的值類型的Postgres這樣的值類型:如何檢查的Postgres裏

SELECT id, 
     CASE 
     WHEN val_is_integer THEN (SOME_QUERY) 
     WHEN val_isnot_integer THEN (ANOTHER_QUERY) 
     ELSE 0 
     END 
    FROM test; 

如何做到這一點?


筆記: 值表VARCHAR類型,並在該領域有值是數字和varchar ...

例如:

ID | value 
1 | test 
2 | 10 
3 | 12 
4 | test123 
+3

數據類型必須與要返回列值的CASE語句中的所有結果相同。但是不清楚你正在測試的是哪一列,或者它是數據類型......否則,你正在檢查列數據的系統表以及動態SQL ...... – 2010-09-30 04:54:10

+0

PostgreSQL文檔是否有關於數據類型優先級的任何內容? – onedaywhen 2010-09-30 08:57:28

回答

6

值列始終varchar類型,看起來你想檢查內容是否是一個數字/整數。

你可以通過創建一個函數來做到這一點,例如,

create function isdigits(text) returns boolean as ' 
select $1 ~ ''^(-)?[0-9]+$'' as result 
' language sql; 

(這功能也許可以通過嘗試投放文本詮釋,或使用INT4()函數和捕捉髮生過的錯誤,並返回NULL實現。)

有了這樣的功能你可以這樣做:

SELECT id, 
     CASE 
     WHEN value IS NULL THEN 0 
     WHEN isdigits(value) THEN (SOME_QUERY) 
     ELSE (ANOTHER_QUERY) 
     END 
    FROM test; 
15

如果任何人懷疑如何剛剛獲得的varible數據類型(不列),你可以使用功能。

只需

SELECT pg_typeof(your_variable); 

OR

SELECT pg_typeof('{}'::text[]); //returns text[]; 

注意

pg_typeof(varchar_column)將返回字符改變,無論 列的內容。任何列或變量已經鍵入,並且pg_typeof將返回該聲明的類型。它不會根據該列(或變量)的值找到「最佳 擬合」類型。 - 來自a_horse_with_no_name的評論引用。

+1

無論列的內容如何,​​'pg_typeof(varchar_column)'都會返回'character varying'。任何列或變量都已經鍵入,'pg_typeof'將返回該聲明的類型。它不會根據該列(或變量)的值找到「最佳擬合」類型。 – 2017-05-04 11:57:26

+0

@a_horse_with_no_name謝謝你,我不知道,我來這裏搜索「如何獲得可變數據類型」,所以我想我應該分享一個幫助我的方法。讓我更新您剛分享的信息。 – ArchNoob 2017-05-04 13:42:34