Oracle PL/SQL从名称中获得第一个字母(HUN)
这个问题听起来很简单,因为只需要一个substring (name,1,1)
。但在匈牙利语中有许多字母包含多字符。例如:CS,DZ,DZS,LY,NY,SZ,TY,ZS
Oracle PL/SQL从名称中获得第一个字母(HUN)
IF v_type='by_name' THEN
select DISTINCT name
into v_result
from my_table
where instr(_START_LETTERS_,substr(upper(v_name),1,1))>0 and ZIPCODE = v_act_zipcode;
return v_result;
和我的表如:
zipcode name _START_LETTERS
1234 Ryan A,B,C
1234 Bryan CS,D
如果我要得到我的名字克萨纳德我需要得到CS不是第一个字符C->监守我会得到多行例外。
您是否有使用第一个lettor的建议?或者我必须编写一个巨大的if-else/case结构来使我的代码变得糟糕透顶。
感谢
我想最直接的解决方法是编写一个存储功能,提取的第一个字母:我想用正则表达式
create function hun_first_letter(name in varchar2) return varchar2 as
begin
if substr(upper(name),1,3) in ('DZS') then
return substr(name,1,3);
elsif substr(upper(name),1,2) in ('CS','DZ','LY','NY','SZ','TY','ZS','GY') then
return substr(name,1,2);
else
return substr(name,1,1);
end if;
end;
尝试更换substr(upper(v_name), 1, 1)
有:
regexp_substr(upper(v_name), '^[[:alpha:][.cs.][.xx.][.yy.]]', 1, 1, 'i')
其中[:alpha:]
是一个特殊的函数(任何文字) - 事实上,我不知道,也许仅此功能可以找到整理序列(取决于NLS)
[.cs.]
是整理序列的一个例子; [.xx.], [.yy.]
- 其他整理顺序可能在您的NLS
所以REGEXP_SUBSTR上述尝试找到任何信件或“CS”或“XX”或“YY”等 它开始从位置= 1返回搜索次数= 1。最后,搜索是你可以检查是否此功能的情况下insentitive(“我”)
但首先:
regexp_substr(upper(v_name), '^[[:alpha:]]', 1, 1, 'i')
会发现你整理塞克NCES(我很高兴知道这一点)
感谢。但是这个阿尔法给了我oracle的错误。所以我现在不能使用它。所以我想我会把你的功能ammmoQ写成完美的作品。 – Csanesz 2014-10-17 08:48:49
Thx这是一个很好的代码,完美的作品。 – Csanesz 2014-10-17 08:49:10
仅供参考如果我忘记添加'GY':P如果有人想正确使用,请将'GY'添加到第二个! – Csanesz 2014-10-28 11:43:13
@Csanesz:感谢您的信息,我相应地编辑了我的答案。 – 2014-10-28 14:32:41