如何识别变量是否包含 Oracle 中的换行符

How to recognize if a variable contains a newline character in Oracle

我有一个程序将 2 个变量作为输入,其中一个变量可能包含由 enter 或 space 分隔的字符串字符。

Space 然而很容易弄清楚,但是我们如何弄清楚变量中是否有换行符。

我试过使用 chr(10) 但没有用,因为我必须识别字符串是否由换行符分隔。顺便说一下,即使 chr(10) 也无法插入以 space 分隔的字符串。

select 'ABC' || chr(10) || 'DEF' as c from dual

我目前没有输入这样的变量,所以甚至无法尝试缩小到某些解决方案,而且上面的查询也不 运行 好,我的意思是它没有给出如下所示的输出。

ABC
DEF

我也搜索过不同的 oracle 文档,但没有找到。

不胜感激。

create table sample (a varchar2(100));
insert into sample (a) values ('HI_next_line
hello_next_line
hello2');
insert into sample (a) values ('singleline1');
insert into sample (a) values ('singleline2');

SQL> select * from sample;

A
-----------------------------------------------------------------------
HI_next_line
hello_next_line
hello2

singleline1
singleline2

SQL> select *
  2  from sample
  3  where instr(a, chr(10)) > 0;

A
-----------------------------------------------------------------------
HI_next_line
hello_next_line
hello2

一个换行取决于操作系统。在基于Unix的OS中是CHR(10),在Windows中是CHR(13) 接着是 CHR(10).

您可以使用以下任一方式:

  • LIKE '%'||chr(10)||'%'
  • INSTR(column_name, chr(10)) > 0

让我们看看Windows中的测试用例 OS:

SQL

使用 LIKE

SQL> WITH DATA AS(
  2  SELECT 'ABC' || chr(10) || 'DEF' AS c FROM dual UNION ALL
  3  SELECT 'PQR' || ' ' || 'XYZ' AS c FROM dual UNION ALL
  4  SELECT 'QWE' || CHR(13) || 'RTY' AS c FROM dual UNION ALL
  5  SELECT 'no_space' AS c FROM dual
  6  )
  7  SELECT * FROM DATA WHERE c LIKE '%'||chr(10)||'%';

C
--------
ABC
DEF


SQL>

使用 INSTR

SQL> WITH DATA AS(
  2  SELECT 'ABC' || chr(10) || 'DEF' AS c FROM dual UNION ALL
  3  SELECT 'PQR' || ' ' || 'XYZ' AS c FROM dual UNION ALL
  4  SELECT 'QWE' || CHR(13) || 'RTY' AS c FROM dual UNION ALL
  5  SELECT 'no_space' AS c FROM dual
  6  )
  7  SELECT * FROM DATA WHERE INSTR(c, chr(10)) > 0;

C
--------
ABC
DEF


SQL>

PL/SQL

使用 LIKE

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    c VARCHAR2(100);
  3  BEGIN
  4    c:='ABC' || chr(10) || 'DEF';
  5    IF c LIKE '%'||chr(10)||'%' THEN
  6      dbms_output.put_line('found chr(10)');
  7    ELSE
  8      dbms_output.put_line('not found');
  9    END IF;
 10  END;
 11  /
found chr(10)

PL/SQL procedure successfully completed.

SQL>

使用 INSTR

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    c VARCHAR2(100);
  3  BEGIN
  4    c:='ABC' || chr(10) || 'DEF';
  5    IF INSTR(c, chr(10)) > 0 THEN
  6      dbms_output.put_line('found chr(10)');
  7    ELSE
  8      dbms_output.put_line('not found');
  9    END IF;
 10  END;
 11  /
found chr(10)

PL/SQL procedure successfully completed.

SQL>