【问题标题】:How to parse a string and create rows in SQL (postgres)如何在 SQL (postgres) 中解析字符串并创建行
【发布时间】:2009-07-21 19:05:17
【问题描述】:

我有一个包含开始日期、结束日期和排除项的单个数据库字段

可用 DD/MONTH/YYYY [到 DD/MONTH/YYYY]?[,排除 WORD [, WORD]*]?

意味着它总是以“可用的 DD/MONTH/YYYY”开头,可选地有一个“到 DD/MONTH/YYYY”,并且可选地有一个以逗号分隔的字符串列表的排除子句。想想 + 、 * 和 ? 的正则表达式含义

我的任务是提取数据,因此我们现在将有一个“startdate”列、“enddate”列和一个包含排除项的新表。它将需要使用从可用性字符串解析的值填充 startdate 和 enddate 列。它还需要在新的排除表中创建多条记录,为可用性字符串中“排除”关键字后面的每个逗号分隔值创建一条记录。

这是我只能在 SQL 中执行的迁移(postgres 8.4)吗?

这是针对 postgres 8.4 的。

更新: 在同事的帮助下,我们现在有了一个 sql 脚本,它的结果是 sql 可以根据排除项的解析来执行插入语句。它在 sql 中使用一堆 case 语句和字符串操作来生成结果。然后我将输出发送到一个文件并执行该文件以执行插入。我对开始和结束日期列做同样的事情。

这不是 100% 的 sql,而是一个简单的 .bat 或 .sh 文件,它运行第一个 .sql 文件,然后只需要生成一个即可。

感谢您的意见。

【问题讨论】:

  • 表上是否会有一个排序 id,其 startdate 和 enddate 将是排除表上的外键?
  • 是的,具有 startdate 和 enddate 的实体有一个 id。它与排除是多对多的关系,因此两者有一个连接表。

标签: sql postgresql parsing migration


【解决方案1】:

您可以通过结合使用 regexp functions ( 和 to_date() 或 to_timestamp() 函数来做到这一点。

但是在 pl/perl 的函数中只修改文本可能更容易。这将使您可以访问 perl 中的完整操作函数,同时将工作保留在数据库中,这似乎是您的规范。

【讨论】:

    【解决方案2】:

    为什么是单个 SQL?

    用 Ruby/Python/Basic 编写简单的脚本,从源中读取数据,解析它,然后放入目标数据库。

    还是这么大?

    【讨论】:

    • 好问题,我可能最终会这样做。当前的约定是创建一个将在安装时运行的 SQL 脚本。因为它需要迁移生产数据,所以我想坚持惯例,因为这样就不太可能把事情搞砸了,但是如果我必须为这个迁移引入一个特殊的过程,那么我会的。
    • 如果您没有任何可用的语言,这会使脚本难以移植。除此之外,人们还需要学习一门额外的语言。我们也更喜欢使用 SQL 进行解析。
    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多