2017-05-19 10 views
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 

iは、次のエラーを取得しようとした

ERROR: Invalid input syntax for type numeric: « »

私はバックスラッシュ、二重引用符、エスケープを使用するような '' 'を扱うために多くの方法を試しましたが、私は自分の問題を解決できませんでした。

+1

集計関数が含まれていない場合のGROUP BYの理由は何ですか?そしてSELECT DISTINCTと組み合わせる? – jarlh

+0

lei.nennweiteに空白または空白がありますか? – JGH

+0

私はgroup byを使っています。これは、別のテーブルの別の行で選択していた最初のクエリの一部なので、トピックに対して削除するのを忘れましたが、ここでは何も変更しません。 –

答えて

1

入力が正しくない場合、数値へのキャストは失敗します。 あなたの入力が有効であることを確認し、2つのケースがない場合はそれを処理するか、または入力を数値にキャストできない場合はNULLを返すuse a functionを処理できます。

エラーメッセージには、問題を作成したエントリの種類(この場合は空白)が記載されています。あなたが見てみたいことがあり、サイドノートでは

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

:あなたは

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

またはISNUMERIC()関数を使用してNULL(あるいはあなたが適して考える任意の値)でそれを置き換えることによって、それを扱うでしょう"、見つかった場合は入力から削除してから番号を読み取り、最後に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);