SQL Select Like Column Name из таблицы

Цель состоит в том, чтобы создать функцию 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;

Какие изменения я могу внести в свою функцию или как я звоню, чтобы эта функция могла быть применена правильно.

2 ответа

Почему вы хотели бы сделать такую вещь, о которой я понятия не имею, но вы могли бы легко открыть открытый курсор 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)

licensed under cc by-sa 3.0 with attribution.