2017-05-19 147 views
2

我需要值下表中選擇了PostGIS 2.2:手柄SQL特殊字符

nennweite字符改變(10)

1", 
100, 
110, 
125, 
150, 
200, 
250, 
... 

這些值類型爲varchar,但我wan't選擇它們作爲數值所以我嘗試

SELECT DISTINCT 
CASE 
WHEN lei.nennweite = '1"' THEN 25.4 
ELSE CAST(lei.nennweite AS numeric) 
END as d2 
FROM public."WAS_LEITUNG" lei, qwat_vl.pipe_material vl_pipe_mat 
WHERE lei.material = 1 AND vl_pipe_mat.value_fr = 'Fonte' 
GROUP BY d2, vl_pipe_mat.id 
ORDER BY d2 

我得到以下錯誤

ERROR: Invalid input syntax for type numeric: « »

我嘗試了很多方法來處理'''就像使用反斜槓,雙引號,轉義,但我沒有設法解決我的問題。

+1

爲什麼GROUP BY在不涉及集合函數時?並結合SELECT DISTINCT? – jarlh

+0

你有沒有在lei.nennweite中有空或空的空格? – JGH

+0

我使用group by,因爲它只是在不同表格的不同行上選擇的初始查詢的一部分,我只是忘記爲主題刪除它,但我在這裏沒有更改任何內容。 –

回答

1

如果輸入不是數字,則轉換爲數字將失敗。 您可以確保您的輸入有效,並處理兩種情況,如果輸入不能轉換爲數字,則可以返回NULL,否則您可以輸入use a function

錯誤消息確實提到了創建問題的條目類型,在本例中爲空白。你會由NULL替換它(或任何價值,你認爲合適)

CASE 
    WHEN lei.nennweite = '1"' THEN 25.4 
    WHEN lei.nennweite = ' ' THEN NULL 
    ELSE CAST(lei.nennweite AS numeric) 
END as d2 

或使用ISNUMERIC()函數處理:

CASE 
     WHEN lei.nennweite = '1"' THEN 25.4 
     WHEN isnumeric(lei.nennweite) THEN CAST(lei.nennweite AS numeric) 
     ELSE NULL 
END as d2 

在一個側面說明,你可能想看看的",如果發現從輸入中刪除它,然後讀取數字,最後乘以25.4。它會確保輸入2「或1.5」將被處理。

0

你可能想嘗試to_number(string, formatStr)而不是演員。

SELECT to_number(x, '9999999') 
FROM (VALUES 
    ('1"'), 
    ('100'), 
    ('110'), 
    ('125'), 
    ('150'), 
    ('200'), 
    ('250') 
) AS t(x);