Поиск Firebird и поиск строкового значения во всех столбцах

Вопрос:Мне нужно найти, существует ли строковое значение в любом столбце моей таблицы. Возможно ли создать автоматическую процедуру или запрос в Firebird, которые выполняют эту работу без явных имен столбцов? Имена столбцов можно найти по этому запросу: выберите RDB $RELATION_FIELDS.rdb $field_name как NC из RDB $RELATION_FIELDS, где RDB $RELATION_FIELDS.rdb $relation_name = MY_Table_name Я бы использовал процедуру,

Вопрос:

Мне нужно найти, существует ли строковое значение в любом столбце моей таблицы.
Возможно ли создать автоматическую процедуру или запрос в Firebird, которые выполняют эту работу без явных имен столбцов?

Имена столбцов можно найти по этому запросу:

выберите RDB $RELATION_FIELDS.rdb $field_name как NC из RDB $RELATION_FIELDS, где RDB $RELATION_FIELDS.rdb $relation_name = MY_Table_name

Я бы использовал процедуру, похожую на процедуру в firebird.

Кто-нибудь может мне помочь?

– отредактировать

SET TERM ^^ ; CREATE PROCEDURE P_FINDSTRINGINTABLE ( STRTOFIND VarChar(255), TBLNAME VarChar(255)) returns ( SQLCOMMAND VarChar(25000)) AS DECLARE VARIABLE condSTR VARCHAR(8000); DECLARE VARIABLE columnName VARCHAR(8000); begin sqlCommand = ‘select * from ‘|| upper( :TBLNAME ); condSTR = »; for select RDB$RELATION_FIELDS.rdb$field_name as NC from RDB$RELATION_FIELDS where RDB$RELATION_FIELDS.rdb$relation_name = upper( :TBLNAME ) into :columnName do begin condSTR = condSTR||columnName||’ LIKE »%’||STRTOFIND||’%» OR ‘; end IF ( CHAR_LENGTH(condSTR) > 0 ) THEN begin condSTR = ‘ where ‘ || left(condSTR, CHAR_LENGTH (condSTR)-3) || ‘;’; sqlCommand = sqlCommand|| condSTR; end ELSE sqlCommand = sqlCommand||’;’ ; end ^^ SET TERM ; ^^

Хорошо… Я создал правильную строку sql для моего поиска.
Теперь… если я выполняю эту процедуру Firebird, она возвращает команду sql как строку.

Существуют ли методы автоматического выполнения возвращенного select????

Лучший ответ:

Вы можете достичь чего-то достаточно близкого к тому, чего хотите, я верю, используя EXECUTE STATEMENT, чтобы создать представление, которое затем вернет значения.

Пример того, что я имею в виду:

sqlCommand = ‘select * from ‘|| upper( :TBLNAME ); /* Rest of your code for creating the sqlCommand variable */ viewCommand = «RECREATE VIEW V_SEARCH_RESULTS AS » || sqlCommand; EXECUTE STATEMENT viewCommand;

Таким образом, в основном ваша процедура P_FINDSTRINGINTABLE не вернет никаких значений, но (re) создаст представление, динамически называемое V_SEARCH_RESULTS. Все, что вам нужно сделать, это выбрать из этого представления, чтобы увидеть результаты.

Ответ №1

Если вам нужен полный текстовый поиск в вашей БД, я предлагаю вам использовать специализированную поисковую систему, которая интегрируется с Firebird. Это по соображениям производительности.
Взгляните на двигатели SphinxSearch или Solr.

Оцените статью
Добавить комментарий