OraclePL/SQL如何连接一行和另一行中值的第一个字母
第一次问这个问题,我希望我没有搞错标题 我有一个表,上面有用户的名字和姓氏。我需要以以下方式填充用户行: 用户必须以其名字的第一个字母的形式书写,然后以小写字母填写其全名 伊万·霍瓦特=伊霍瓦特 我需要替换符号č=c,ć=c,š=s 如果用户重复,则必须添加多个重复1,但不包括 ihorvat,ihorvat2OraclePL/SQL如何连接一行和另一行中值的第一个字母,sql,oracle,join,Sql,Oracle,Join,第一次问这个问题,我希望我没有搞错标题 我有一个表,上面有用户的名字和姓氏。我需要以以下方式填充用户行: 用户必须以其名字的第一个字母的形式书写,然后以小写字母填写其全名 伊万·霍瓦特=伊霍瓦特 我需要替换符号č=c,ć=c,š=s 如果用户重复,则必须添加多个重复1,但不包括 ihorvat,ihorvat2 +----+------+--------+--------+ | id | user | first | last | +----+------+--------+-------
+----+------+--------+--------+
| id | user | first | last |
+----+------+--------+--------+
| 1 | | Ivan | Horvat |
| 2 | | Matija | Horvat |
| 3 | | Ivan | Babić |
| 4 | |Tomislav| Jurišić|
| 5 | | Ivan | Horvat |
+----+------+--------+--------+
我知道函数我可以使用函数LOWER、REPLACE、SUBSTR等,但我不知道如何将所有这些组合到一个代码中。这里有一个选项:
第1-7行-样本数据
tuser CTE第8-15行从Ivan Horvat中创建所需格式ihorvat并翻译字符
最终选择使用分析函数,该函数为每个val创建行号;如果行号大于1,则使用大小写连接该行号
这里有一个选择:
第1-7行-样本数据
tuser CTE第8-15行从Ivan Horvat中创建所需格式ihorvat并翻译字符
最终选择使用分析函数,该函数为每个val创建行号;如果行号大于1,则使用大小写连接该行号
这里有一个可能的解决方案,但请注意,它不是最优的,并且在大型表上的性能会很差
DECLARE
CURSOR c_users IS SELECT id, TRANSLATE(LOWER(SUBSTR(first,1,1) || last), 'ćčđšž', 'ccdsz') name FROM users;
TYPE ty_users IS TABLE OF c_users%rowtype;
t_users ty_users;
v_count NUMBER;
BEGIN
OPEN c_users;
FETCH c_users BULK COLLECT INTO t_users;
CLOSE c_users;
FOR i IN t_users.FIRST..t_users.LAST LOOP
IF t_users.EXISTS(i) THEN
v_count := 0;
FOR j IN 1..i LOOP
IF t_users.EXISTS(i) AND t_users(i).name = t_users(j).name AND i <> j THEN
v_count := v_count + 1;
END IF;
END LOOP;
IF v_count > 0 THEN
t_users(i).name := t_users(i).name || v_count;
END IF;
END IF;
END LOOP;
IF t_users.COUNT > 0 THEN
FORALL indx IN INDICES OF t_users
UPDATE users SET username = t_users(indx).name WHERE id = t_users(indx).id;
END IF;
END;
这里有一个可能的解决方案,但请注意,它不是最优的,并且在大型表上的性能会很差
DECLARE
CURSOR c_users IS SELECT id, TRANSLATE(LOWER(SUBSTR(first,1,1) || last), 'ćčđšž', 'ccdsz') name FROM users;
TYPE ty_users IS TABLE OF c_users%rowtype;
t_users ty_users;
v_count NUMBER;
BEGIN
OPEN c_users;
FETCH c_users BULK COLLECT INTO t_users;
CLOSE c_users;
FOR i IN t_users.FIRST..t_users.LAST LOOP
IF t_users.EXISTS(i) THEN
v_count := 0;
FOR j IN 1..i LOOP
IF t_users.EXISTS(i) AND t_users(i).name = t_users(j).name AND i <> j THEN
v_count := v_count + 1;
END IF;
END LOOP;
IF v_count > 0 THEN
t_users(i).name := t_users(i).name || v_count;
END IF;
END IF;
END LOOP;
IF t_users.COUNT > 0 THEN
FORALL indx IN INDICES OF t_users
UPDATE users SET username = t_users(indx).name WHERE id = t_users(indx).id;
END IF;
END;
依我看,你应该分为你提到的三点。第一个是连接,第二个是替换,第三个是查找重复用户。您的用户栏是否接受非唯一值?@zagvir您能给我们看一些基本代码吗?现在,你要求我们帮你做作业……我可以把它分为3分。第一个是CONCATSUBSTRfirst,1,1,最后一个是replaceuser,č,ć,š,s。。。我不知道如何完成最后一点,以及如何在单个过程/功能中将其结合在一起。我刚开始学习PL/SQL,我理解函数,但不知道如何组合它们。从我的观点来看,你应该分为你提到的三点。第一个是连接,第二个是替换,第三个是查找重复用户。您的用户栏是否接受非唯一值?@zagvir您能给我们看一些基本代码吗?现在,你要求我们帮你做作业……我可以把它分为3分。第一个是CONCATSUBSTRfirst,1,1,最后一个是replaceuser,č,ć,š,s。。。我不知道如何完成最后一点,以及如何在单个过程/功能中将其结合在一起。我刚开始学习PL/SQL,我理解函数,但不知道如何组合它们。在哪个模块中以及如何进行。