Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL从表中选择类似的列名_Sql_Oracle_Plsql - Fatal编程技术网

SQL从表中选择类似的列名

SQL从表中选择类似的列名,sql,oracle,plsql,Sql,Oracle,Plsql,目标是创建一个Oracle函数,该函数能够从用户提供的令牌中查询列名,从而创建一个具有此类功能的函数 select cols_like('%e%') from table 这就是我目前的观点 CREATE OR REPLACE Function COLS_LIKE (v_search in VARCHAR2, v_table in VARCHAR2) RETURN VARCHAR IS TYPE r_cursor IS REF CURSOR; c_emp r

目标是创建一个Oracle函数,该函数能够从用户提供的令牌中查询列名,从而创建一个具有此类功能的函数

select cols_like('%e%') from table
这就是我目前的观点

CREATE OR REPLACE Function COLS_LIKE 
(v_search in VARCHAR2, v_table in VARCHAR2) 
RETURN VARCHAR
IS
    TYPE r_cursor IS REF CURSOR;
    c_emp         r_cursor;
    crs_cols      VARCHAR(255);
    column_list   VARCHAR(1000);
BEGIN    
    OPEN c_emp FOR 
        'select COLUMN_NAME from cols 
         where TABLE_NAME = ''' || v_table || ''' 
         and column_name like ''' || v_search || ''''; 
LOOP
    FETCH c_emp INTO crs_cols;

    EXIT WHEN c_emp%NOTFOUND;

    if column_list IS NULL THEN 
        column_list := crs_cols;
    else 
        column_list := column_list || ', ' || crs_cols;
    end if;
END LOOP; 

RETURN column_list;

END;
在这里,您可以调用这样的函数

Declare
    tests VARCHAR(100);
    sql_stmt VARCHAR2(200);
begin
    tests := COLS_LIKE('%E%', 'table');
    DBMS_OUTPUT.PUT_LINE(tests);
-- OR
    sql_stmt := 'select ' || COLS_LIKE('%E%', 'table') || ' from table';
    DBMS_OUTPUT.PUT_LINE(sql_stmt);
end;
select COLS_LIKE('%E%', 'table') from table;
最终目标应该是这样的

Declare
    tests VARCHAR(100);
    sql_stmt VARCHAR2(200);
begin
    tests := COLS_LIKE('%E%', 'table');
    DBMS_OUTPUT.PUT_LINE(tests);
-- OR
    sql_stmt := 'select ' || COLS_LIKE('%E%', 'table') || ' from table';
    DBMS_OUTPUT.PUT_LINE(sql_stmt);
end;
select COLS_LIKE('%E%', 'table') from table;
我可以对我的函数进行哪些修改,或者如何调用,以便正确应用此函数。

您为什么要这样做我不知道,但您可以非常轻松地将打开的游标返回到PL/SQL:

create or replace function cols_like (
     PTable in varchar2
   , PColumn in varchar2
     ) return sys_refcursor

   l_cols varchar2(32767);
   c_curs sys_refcursor;

begin

   select listagg(column_name, ', ') within group (order by column_id)
     into l_cols
     from user_tab_cols
    where table_name = upper(Ptable)
      and column_name like '%' || upper(PColumn) || '%'
          ;

   open c_curs for '
     select ' || l_cols || '
       from ' || Ptable;

   return c_curs;

end;
/
将其返回到标准SQL语句将非常困难,这是因为在选择此函数时,您只选择了一列的数据。您希望能够选择N列,这意味着您需要开始返回已动态创建的嵌套表


我相信这是可能的;但是,在你开始尝试这样做之前,想想你为什么要这样做。问一个问题,你没有陈述你的最终目标,但你陈述了你的实际问题是什么。有可能会有更简单的解决方案。

我也遇到了同样的问题,并发现了这个问题,它对我很有效。我刚刚比较了两个表中的手机号码,其中一个表中有些号码的起始值为0,有些则没有。最终得到了解决方案,并在开始时添加了%

a.number was having numbers, in some of them starting 0 was missing. and b.number was accurate.

b.number like CONCAT('%',a.number)