Oracle 子字符串的巧妙使用
我的问题是关于一个名为contract_nm varchar2(14)的字段。我需要从中获取3个不同的值,使用该字段获取where子句的筛选器 这是示例数据以及数据的长度,可能是9、10或11,现在不能再多了Oracle 子字符串的巧妙使用,oracle,substring,Oracle,Substring,我的问题是关于一个名为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
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) 我需要显示合同的最后3个字符
2) 检查合同的最后3个字符,查看第一个字母是否为以下其中一个字母,然后是该月,年份是接下来的2个字母,日期默认为该月的第一天。我需要像日期一样显示,因为它将进入日期字段
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) 这是一个有点难以书面解释,我会尝试,希望你能理解我!!!读取合同数据,忽略前五个字符(F.US.),然后忽略最后三个字符,即Z11。现在,我们使用的是1个字符(9个长度)或2个字符(10个长度)或中间的3个字符(11个长度),总是看到下面的数据。如果是1个字符,则显示该字母;如果是2个字符,则检查第2个字母,如果不是“E”或“A”或“T”,则显示两个字母,否则仅显示第1个字母。否则,如果输入3个字符,则显示前2个字母
4) 我的where子句需要一个过滤器来读取合同数据,忽略前五个字符(F.US.),然后忽略最后三个字符,即Z11。现在,我们使用的是1个字符(9个长度)或2个字符(10个长度)或中间的3个字符(11个长度),总是看到下面的数据。如果是两个字符,则检查第二个字母,如果不是“E”或“T”,则不要提取数据,否则请执行此操作。否则,如果是3个字符,则检查第3个字母,如果不是“E”或“T”,则不要提取数据,否则请执行此操作
1) 我需要显示最后3个
合同性质
使用SUBSTR(合同编号-3)
对于Q2,使用大小写表达式,例如:
CASE SUBSTR(contract_nm, -3, 1)
WHEN 'F' THEN TO_DATE('JAN'||SUBSTR(contract_nm, -2), 'MONRR')
WHEN 'G' THEN TO_DATE('FEB'||SUBSTR(contract_nm, -2), 'MONRR')
...etc.
END
请尝试以下操作:
问题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;
分享和享受。关注如何将合同分解为您需要的部分。然后创建一个视图,以便您可以将每个部分视为一列。然后,应用各种条件和转换应该很简单 看起来你总是忽略前5个字符,所以就把它们删掉吧
SELECT SUBSTR( contract_nm, 5, LENGTH(contract_nm)-8 ) flags,
SUBSTR( contract_nm, -3, 1 ) month_flag,
SUBSTR( contract_nm, -2 ) year
FROM table
1) 月|年
(二) (三) 4) 非常类似于#3
TO_DATE(
CASE month_flag WHEN 'F' THEN 'JAN' WHEN 'G' THEN 'FEB' ... END || year,
'MONRR'
)
CASE WHEN LENGTH(flags) = 3
THEN SUBSTR(flags,1,2)
WHEN LENGTH(flags) = 2 AND SUBSTR(flags,2,1) NOT IN ('E','A','T')
THEN flags
ELSE SUBSTR(flags,1,1)