如何显示在 PL/SQL 上为每个单词添加连字符的字符串

How can i display a string adding a hyphen each word on PL/SQL

如何显示一个字符串,使用 for 循环用破折号分隔每个字母?

例如我要显示:

h-e-l-l-o-w-o-r-l-d

我尝试使用 substr 函数,但我无法将其取出

如果必须PL/SQL和FOR循环,那么你可以

SQL> set serveroutput on
SQL> declare
  2    l_str  varchar2(20) := 'helloworld';
  3    retval varchar2(50);
  4  begin
  5    for i in 1 .. length(l_str) loop
  6      retval := retval || substr(l_str, i, 1) ||'-';
  7    end loop;
  8    retval := rtrim(retval, '-');
  9    dbms_output.put_line(retval);
 10  end;
 11  /
h-e-l-l-o-w-o-r-l-d

PL/SQL procedure successfully completed.

SQL>

否则,考虑例如

SQL> select rtrim(regexp_replace('helloworld', '(.)', '-'), '-') result from dual;

RESULT
-------------------
h-e-l-l-o-w-o-r-l-d

SQL>

SQL> select listagg(substr('helloworld', level, 1), '-') within group (order by level) result
  2  from dual
  3  connect by level <= length('helloworld');

RESULT
--------------------------------------------------------------------------------
h-e-l-l-o-w-o-r-l-d

SQL>

您可以只输出每个连续的字符,在第一个字符之后,在它们之间输出一个连字符:

DECLARE
  string VARCHAR2(20) := 'helloworld';
BEGIN
  DBMS_OUTPUT.PUT(SUBSTR(string, 1, 1));
  FOR i IN 2 .. LENGTH(string)
  LOOP
    DBMS_OUTPUT.PUT('-');
    DBMS_OUTPUT.PUT(SUBSTR(string, i, 1));
  END LOOP;
  DBMS_OUTPUT.NEW_LINE();
END;
/

输出:

h-e-l-l-o-w-o-r-l-d

如果你想在没有循环的情况下完成它,那么你可以使用:

DECLARE
  string VARCHAR2(20) := 'helloworld';
BEGIN
  DBMS_OUTPUT.PUT_LINE( SUBSTR(REGEXP_REPLACE(string, '(.)', '-'), 2) );
END;
/

您不应该使用 LTRIM(或 RTRIM)删除连字符,因为如果输入字符串有前导(或尾随)连字符,那么这些连字符将从输出中删除,这将有误。

例如:

DECLARE
  string VARCHAR2(20) := '--helloworld--';
BEGIN
  DBMS_OUTPUT.PUT_LINE('Correct:');
  DBMS_OUTPUT.PUT_LINE(SUBSTR(REGEXP_REPLACE(string, '(.)', '-'), 2));
  DBMS_OUTPUT.PUT_LINE('Incorrect:');
  DBMS_OUTPUT.PUT_LINE(LTRIM(REGEXP_REPLACE(string, '(.)', '-'), '-'));
END;
/

输出:

Correct:
----h-e-l-l-o-w-o-r-l-d----
Incorrect:
h-e-l-l-o-w-o-r-l-d----

db<>fiddle here