我喜欢从查询结果中删除空行和空格来比较两个结果?

时间:2013-08-11 15:16:04

标签: c# oracle string-comparison

我想从查询结果中删除空行和空格,并使用下面的代码,我在哪里做错了?我有2个连接从不同的用户获得结果。我使用get.ddl获取过程定义并尝试比较它们是否相同.Belows是我的2个程序ddl结果并且它们是相同的,但由于空行结果显示不相同

首先查询结果:

CREATE OR REPLACE PROCEDURE "HELL_" 
as
begin
  dbms_output.put_line('Hello!');
end;  

第二个查询结果(有空行)

CREATE OR REPLACE PROCEDURE "HELL_" 
as

begin

  dbms_output.put_line('Hello!');

end;

我的代码

            string result1 = "";
            string result2 = "";

            using (OracleConnection conn1 = new OracleConnection(oradb1))
            {
                conn1.Open();

                using (OracleCommand crtCommand = new OracleCommand("select REGEXP_REPLACE(dbms_metadata.get_ddl('PROCEDURE','HELL_'),('user1...'),'', 1, 0, 'i') from dual", conn1))
                {
                    result1 = crtCommand.ExecuteScalar().ToString(); 

                }
            }
            using (OracleConnection conn2 = new OracleConnection(oradb2))
            {
                conn2.Open();

                using (OracleCommand crtCommand = new OracleCommand("select REGEXP_REPLACE(dbms_metadata.get_ddl('PROCEDURE','HELL_'),('user2...'),'', 1, 0, 'i') from dual", conn2))
                {
                    result2 = crtCommand.ExecuteScalar().ToString();

                }
            }

            var lines1 = result1.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Where(l => l.Trim().Length > 0).Select(l => l.Trim());
            var lines2 = result2.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Where(l => l.Trim().Length > 0).Select(l => l.Trim());



            if (lines1.SequenceEqual(lines2)) 
            {
                MessageBox.Show("same");
            }
            else
            {
                MessageBox.Show("not same");
            }

2 个答案:

答案 0 :(得分:1)

有两种方法可以删除结果集中的空行(仅包含换行符的行):

让我们创建一个简单的存储过程:

SQL> create or replace procedure Some_Proc
  2  is
  3  
  4  
  5  begin
  6  
  7    null;
  8  
  9  
 10  end;
 11  /

Procedure created

通过查询user_source view或使用dbms_metadata,我们会得到以下结果:

select t.text
  from all_source t
where name = upper('some_proc')

结果:

Text 
-------------------------------
procedure Some_Proc
is


begin


  null;


end;
  1. 使用[dba][user][all]_source视图查询时,摆脱空行 rtrim()功能:

    select t.text
      from all_source t
     where name = upper('some_proc')
       and rtrim(t.text, chr(10)) is not null
    

    结果:

    Text 
    -------------------
    procedure Some_Proc
    is
    begin
      null;
    end;
    
  2. dbms_metadata.get_ddl()返回的结果数据中删除空行 函数使用regexp_replace()正则表达式函数:

    select regexp_replace(
                          dbms_metadata.get_ddl( 'PROCEDURE'
                                                ,'SOME_PROC'
                                                , user
                                               )
                         , '('||chr(10)||'){2,}', chr(10)
                         ) as res
      from dual
    

    结果:

    Res 
    ------------------------
    CREATE OR REPLACE PROCEDURE "HR"."SOME_PROC" 
    is
    begin
      null;
    end;
    

答案 1 :(得分:0)

即使添加了空白行,您似乎也希望将文件视为相等。我的建议是,如果你想要忽略空白行,你应该通过你正在创建的集合(lines1和lines2)来消除零长度行。

分享并享受。