gpt4 book ai didi

oracle - 子字符串的棘手使用

转载 作者:行者123 更新时间:2023-12-02 02:52:28 25 4
gpt4 key购买 nike

我的问题是关于一个名为contract_nm varchar2(14) 的字段。我需要从中获取 3 个不同的值,使用该字段来获取 where 子句的过滤器。

这是示例数据以及数据的长度,可以是 9 或 10 或 11,目前不能再多了。

CONTRACT_NM               LENGTH(CONTRACT_NM)
F.US.WZ10 9
F.US.WZ11 9
F.US.WZ12 9
F.US.RBZ10 10
F.US.RBZ11 10
F.US.RBZ12 10
F.US.ZWAZ10 11
F.US.ZWAZ11 11
F.US.ZWAZ12 11
etc

1)我需要显示contract_nm的最后3个字符。

2) 检查contract_nm的最后3个字符,看看第一个字母是否是以下之一,那么接下来的2个字母就是MONTH和YEAR,DAY将默认为第一天这个月。我需要像日期一样显示,因为它要进入日期字段。

Trade Months (Terms):
F January
G February
H March
J April
K May
M June
N July
Q August
U September
V October
X November
Z December

3)这有点难以用书面形式解释,我会尽力希望你理解我!读取contract_nm数据,忽略前五个字符(F.US.),然后忽略最后3个字符,即Z11。现在,我们正在处理的是中间的 1 个字符(9 长度)或 2 个字符(10 长度)或 3 个字符(11 长度)的数据,请参阅下面的数据。如果有 1 个字符,则显示该字母,否则如果有 2 个字符,则检查第二个字母,如果不是“E”、“A”或“T”,则显示这两个字母,否则仅显示第一个字母。否则如果有 3 个字符,则显示前 2 个字母。

4) 我的 where 子句需要一个过滤器来读取 Contract_nm 数据,忽略前五个字符 (F.US.),然后忽略最后 3 个字符,即 Z11。现在,我们正在处理的是中间的 1 个字符(9 长度)或 2 个字符(10 长度)或 3 个字符(11 长度)的数据,请参阅下面的数据。如果有 2 个字符,则检查第二个字母,如果不是“E”或“T”,则不提取数据,否则执行。否则如果 3 个字符,则检查第三个字母,如果不是“E”或“T”,则不提取数据,否则执行。

最佳答案

尝试以下操作:

问题1:

  contract_nm_month_year := substr(contract_nm, -3);

问题2:

  contract_date := CASE substr(contract_nm, -3, 1)
WHEN 'F' THEN TO_DATE('01-JAN-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'G' THEN TO_DATE('01-FEB-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'H' THEN TO_DATE('01-MAR-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'J' THEN TO_DATE('01-APR-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'K' THEN TO_DATE('01-MAY-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'M' THEN TO_DATE('01-JUN-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'N' THEN TO_DATE('01-JUL-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'Q' THEN TO_DATE('01-AUG-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'U' THEN TO_DATE('01-SEP-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'V' THEN TO_DATE('01-OCT-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'X' THEN TO_DATE('01-NOV-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
WHEN 'Z' THEN TO_DATE('01-DEC-' || SUBSTR(contract_nm, -2), 'DD-MON-RR');
ELSE NULL;
END;

问题3:

  display_3 := CASE length(contract_nm)
WHEN 9 THEN SUBSTR(contract_nm, 6, 1);
WHEN 10 THEN
CASE SUBSTR(contract_nm, 7, 1)
WHEN 'E' THEN SUBSTR(contract_nm, 6, 1);
WHEN 'A' THEN SUBSTR(contract_nm, 6, 1);
WHEN 'T' THEN SUBSTR(contract_nm, 6, 1);
ELSE SUBSTR(contract_nm, 6, 2);
END;
WHEN 11 THEN SUBSTR(contract_nm, 6, 2)
END;

问题4:

  WHERE CASE length(contract_nm)
WHEN 9 THEN 0 -- never pull data for contract length = 9
WHEN 10 THEN
CASE SUBSTR(contract_nm, 7, 1)
WHEN 'E' THEN 1
WHEN 'T' THEN 1
ELSE 0
END
WHEN 11 THEN
CASE SUBSTR(contract_nm, 8, 10
WHEN 'E' THEN 1
WHEN 'T' THEN 1
ELSE 0
END
ELSE 0
END = 1;

分享并享受。

关于oracle - 子字符串的棘手使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4192517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com