条件时使用替换功能

时间:2015-05-28 09:52:57

标签: sql postgresql date postgresql-9.3

表名为tabelea列为name,expdate。两列都没有空约束。两列都有不同的数据类型。

name expdate

A     '10-05-2015'
B     '    '

现在我想获取expdate不为空的值,然后转换为日期格式,否则为空。所以我试过这个

select name,case when replace(expdate,' ','') <> '' then
to_char(cast(expdate as date),'dd-MM-yyyy') else null end from tablea

但是不能正常显示错误类型日期的输入语法无效:&#34;&#39; &#39;&#34;

如何解决这个问题?

我也试过trim

Postgresql 9.3

2 个答案:

答案 0 :(得分:2)

如果将空字符串转换为null值,则可以在单个调用中将其组合:

select name,
       to_char(cast(nullif(trim(expdate), '') as date),'dd-MM-yyyy') 
from tablea;

cast依赖于一些隐式数据类型转换。最好使用带有显式格式的to_date()

to_char(to_date(nullif(trim(expdate), ''), 'dd-mm-yyyy'),'dd-MM-yyyy') 

SQLFiddle示例:http://sqlfiddle.com/#!15/a9831/1

答案 1 :(得分:1)

您可以使用代字号将字符串与所需的日期模式进行比较,然后再将其作为日期:

select
  name,
  case when expdate ~ '^[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{4}$' then
    to_date(expdate, 'dd-MM-yyyy')
  else
    null
  end as the_date
from tablea;

(当然,首先使用字符串数据类型来存储日期是个坏主意。)

SQL小提琴:http://sqlfiddle.com/#!15/a66cf/2