处理SQL特殊字符

时间:2017-05-19 13:46:51

标签: sql postgresql

我需要在PostGIS 2.2中选择以下值表:

nennweite字符变化(10)

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

这些值类型是varchar,但我不想将它们选为数值,所以我尝试了

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

我收到以下错误

  

错误:数字类型的输入语法无效:«»

我尝试了许多方法来处理'''喜欢使用反斜杠,双引号,逃避,但我无法解决我的问题。

2 个答案:

答案 0 :(得分:1)

如果输入不是数字,则转换为数字将失败。 您既可以确保输入有效,也可以处理未输入的情况,或者如果输入无法转换为数字,则可以use a function返回NULL。

错误消息确实提到了创建问题的条目类型,在本例中为空格。您可以通过将其替换为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"将被处理。

答案 1 :(得分:0)

你可能想尝试to_number(string, formatStr)而不是演员。

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