OraclePL/SQL如何连接一行和另一行中值的第一个字母

OraclePL/SQL如何连接一行和另一行中值的第一个字母,sql,oracle,join,Sql,Oracle,Join,第一次问这个问题,我希望我没有搞错标题 我有一个表,上面有用户的名字和姓氏。我需要以以下方式填充用户行: 用户必须以其名字的第一个字母的形式书写,然后以小写字母填写其全名 伊万·霍瓦特=伊霍瓦特 我需要替换符号č=c,ć=c,š=s 如果用户重复,则必须添加多个重复1,但不包括 ihorvat,ihorvat2 +----+------+--------+--------+ | id | user | first | last | +----+------+--------+-------

第一次问这个问题,我希望我没有搞错标题

我有一个表,上面有用户的名字和姓氏。我需要以以下方式填充用户行:

用户必须以其名字的第一个字母的形式书写,然后以小写字母填写其全名 伊万·霍瓦特=伊霍瓦特 我需要替换符号č=c,ć=c,š=s 如果用户重复,则必须添加多个重复1,但不包括 ihorvat,ihorvat2

+----+------+--------+--------+
| 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,我理解函数,但不知道如何组合它们。在哪个模块中以及如何进行。