解码到目前为止的字符串

时间:2013-06-04 09:14:19

标签: sql plsql

我需要帮助来解码一个String。我想我需要一个PL / SQL脚本来解码String,但我对PL / SQL的了解不是特别的。

我有一个包含7列

的表
  • First Colum包含Objectnumber
  • 第二栏包含年份
  • 第三列包含属于下一个字段的数字
  • 第四列包含描述最后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,表示日期从2012年12月9日开始,到2012年12月31日结束。
  • T2字段的长度为181,表示日期从2013年1月1日开始,到2013年6月30日结束
  • T3 Field的长度为167,这意味着日期从2013年7月1日开始,到2013年12月14日结束。

T1字段始终在31.12.XXYY结束 并且提交的T2和T3始终在同一天T2开始于01.01.XXYY并且T3开始于01.07.2013

在第一行中我有对象1244与Num 8和文本提交“tgl”并且在T1-T3 Field的后面 关于这一点,我可以看到,对象1244每天从2012年12月9日至2013年12月14日开始移动 数字6和27的对象120仅在工作日和星期六移动 和对象169有num 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======

我需要的是: 我需要一个Object移动时的所有日子(应该可用于SQL语句) 所以行对象,年份,数字,文本,解码日

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
...    ....

1 个答案:

答案 0 :(得分: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