0

我需要帮助来解码字符串。我想我需要一个 PL/SQL 脚本来解码字符串,但我在 PL/SQL 方面的知识并不特别。

我有一个包含 7 列的表

  • 第一列包含对象编号
  • 第二列包括一年
  • 第三列包括属于下一个字段的数字
  • 第四列包含描述最后 3 个字段的文本
  • 第 5 到 7 列包括应解码的字符串。
  • 第 5 到 7 列(T1、T2、T3)应解码为日期。(每个数字是物体移动的日期,“=”(等于)或“0”(零)表示物体在这一天没有移动)
  • 数字也描述了一天。

例子

1 = Monday
2 = Tuesday
3 = Wednesday
4 = Thursday
5 = Friday
6 = Saturday
7 = Sunday
8 = Holiday (25.12 =Christmas day)
  • T1 字段的长度为 23,这意味着日期从 09.12.2012 开始,到 31.12.2012 结束
  • T2 字段的长度为 181,即日期从 01.01.2013 开始,到 30.06.2013 结束
  • T3 字段的长度为 167,这意味着日期从 01.07.2013 开始,到 14.12.2013 结束

T1 字段总是在 31.12.XXYY 结束,归档的 T2 和 T3 总是在同一天开始 T2 从 01.01.XXYY 开始,T3 从 01.07.2013 开始

在第一行中,我有对象 1244,编号为 8,文本归档为“tgl”,在 T1-T3 字段后面,关于此我可以看到对象 1244 从 09.12.2012 开始每天移动,直到 14.12.2013 对象 120,编号为 6 27 只在工作日和周六移动,对象 169 的编号为 13,T1 到 T3 字段只有 7 或 8,这意味着该对象仅在周日和节假日移动

表格示例:

object Year    Num   text    T1                         T2                                                                                                                                                                                       T3
1244   2013    8     tgl     71234567123456718845671    8345671234567123456712345671234567123456712345671234567123456712345671234567123456712345678234567123456712345671234567128456712385671234567823456712385671234567123456712345671234567    12345671234567123456712345671234567123456712385671234567123456712345671234567123456712345671234567123456712345671234587123486712345671234567123456712345671234567123456
120    2013    6     Sa      ======6======6======6==    ====6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6=    =====6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======6======8======6======6======6======6======6======6======6
120    2013    27    X(Sa)   =12345==12345==1==45==1    =345==12345==12345==12345==12345==12345==12345==12345==12345==12345==12345==12345==12345===2345==12345==12345==12345==12=45==123=5==12345===2345==123=5==12345==12345==12345==12345==    12345==12345==12345==12345==12345==12345==123=5==12345==12345==12345==12345==12345==12345==12345==12345==12345==12345==1234===12345==12345==12345==12345==12345==12345=
169    2013    13    +       7======7======7=88===7=    8====7======7======7======7======7======7======7======7======7======7======7======7======78=====7======7======7======7==8===7===8==7======78=====7===8==7======7======7======7======7    ======7======7======7======7======7======7===8==7======7======7======7======7======7======7======7======7======7=====87====8=7======7======7======7======7======7======

我需要的是:我需要一个对象移动时的所有天数(应该可用于 SQL 语句)所以 Rows 对象、Year、num、Text、decoded day

Example:
Object  Year    Num     text        Day
1244        2013    8       tgl     09.12.2012
1244        2013    8       tgl     10.12.2012
1244        2013    8       tgl     11.12.2012
...    ....
4

1 回答 1

2

看起来 T1-T3 就像日历一样。我无法理解为什么数据分为三列。我将假设这T1||T2||T3是一个日历,其中每个字母都是一年中以 开头的一天,并01-01-YEAR使用您自己的一组业务规则进行修改。

它看起来不像日历中的数字对您的查询很重要,因此您的问题显示为一个简单的枢轴,您可以使用不同的方法解决它,例如(SQLFiddle):

SQL> SELECT ID, YEAR, num, text, substr(t1 || t2 || t3, lvl, 1) subst,
  2         to_date(YEAR||'-01-01', 'YYYY-MM-DD') + lvl - 1 dt
  3    FROM DATA
  4   CROSS JOIN (SELECT ROWNUM lvl
  5                 FROM dual
  6              CONNECT BY LEVEL <= (SELECT MAX(length(t1 || t2 || t3))
  7                                     FROM DATA))
  8   WHERE substr(t1 || t2 || t3, lvl, 1) != '='
  9  ORDER BY 1 DESC, lvl;

        ID       YEAR        NUM TEXT            SUBST  DT
---------- ---------- ---------- --------------- ------ -----------
      1244       2013          8 tgl             7      01/01/2013
      1244       2013          8 tgl             1      02/01/2013
      1244       2013          8 tgl             2      03/01/2013
      1244       2013          8 tgl             3      04/01/2013
      1244       2013          8 tgl             4      05/01/2013
      1244       2013          8 tgl             5      06/01/2013
于 2013-06-04T09:56:46.057 回答