2015-12-14 43 views
0

我想檢查一個字符串數組是否存在已轉換的整數。這個位於一個程序,其中的內部:檢查字符串數組中的整數

nc_ecositeinteger可變
current_consite是一個字符串數組
ecositeinteger
current_ecosite_ncdouble

IF to_char(nc_ecosite, '999') IN 
    (select current_consite from current_site_record 
    where current_ecosite_nc::integer = nc_ecosite) THEN 
     ecosite := nc_ecosite; 

結果總是來自ELSIF那遵循第一個IF。當nc_ecosite位於數組中時(來自檢查),會發生這種情況。當值匹配時,爲什麼ecosite未被填充nc_ecosite

我正在使用pgAdmin中的Postgres 9.3。

+0

任何機會,你可以POS更多的功能,以及投入,預期產出和實際產出?我有點跟隨你,但一些具體的例子將有助於看到你想要什麼,以及發生了什麼。 – Hambone

回答

0

我發現下面提供期望的結果:

IF nc_ecosite in 
(select (unnest(string_to_array(current_consite, ',')))::integer 
from current_site_record 
where current_ecosite_nc::integer = nc_ecosite) THEN 
    ecosite := nc_ecosite::integer; 
0

問題的直接原因是to_char()爲您的給定模式插入了一個空白(遺留原因 - 爲可能的負號留出空間)。使用FM Template Pattern Modifier避免:

to_char(nc_ecosite, 'FM999')

當然,這將是最好的匹配數據類型開始與操作 - 如果可能的話。

除非是,我的建議是更快,更清潔聲明:

SELECT INTO ecosite nc_ecosite -- variable or column?? 
    WHERE EXISTS (
     SELECT 1 FROM current_site_record c 
     WHERE current_ecosite_nc::integer = nc_ecosite 
     AND to_char(nc_ecosite, 'FM999') = ANY(current_consite) 
    ); 

    IF NOT FOUND THEN ... -- to replace your ELSIF 

確保你沒有碰到命名參數,變量和列名之間的衝突!一個普遍的約定是在_之前加上變量名(並且從不對列名使用相同的名稱)。但是,無論如何,您最好在所有查詢中對列名進行限定。你沒有清楚哪一列是哪一列,哪一個是變量......

如果我有完整的函數和表定義,我可能會進一步優化語句。

相關: