Oracle PL/SQL从名称中获得第一个字母(HUN)

问题描述:

这个问题听起来很简单,因为只需要一个substring (name,1,1)。但在匈牙利语中有许多字母包含多字符。例如:CS,DZ,DZS,LY,NY,SZ,TY,ZSOracle 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; 
+0

Thx这是一个很好的代码,完美的作品。 – Csanesz 2014-10-17 08:49:10

+0

仅供参考如果我忘记添加'GY':P如果有人想正确使用,请将'GY'添加到第二个! – Csanesz 2014-10-28 11:43:13

+1

@Csanesz:感谢您的信息,我相应地编辑了我的答案。 – 2014-10-28 14:32:41

尝试更换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(我很高兴知道这一点)

+0

感谢。但是这个阿尔法给了我oracle的错误。所以我现在不能使用它。所以我想我会把你的功能ammmoQ写成完美的作品。 – Csanesz 2014-10-17 08:48:49