2

我需要查找表中的任何列中是否存在字符串值。是否可以在 Firebird 中自动创建过程或查询来执行这项工作而无需明确列名?

可以使用此查询找到列名:

从 RDB$RELATION_FIELDS 中选择 RDB$RELATION_FIELDS.rdb$field_name 作为 NC 其中 RDB$RELATION_FIELDS.rdb$relation_name = MY_Table_name

我会使用类似于 Firebird 中的程序:

http://www.mssqltips.com/sqlservertip/1522/searching-and-finding-a-string-value-in-all-columns-in-a-sql-server-table/

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 命令。

是否有自动执行返回的选择的方法?

4

3 回答 3

1

如果您需要在数据库中进行全文搜索,我建议您使用与 Firebird 集成的专用搜索引擎。这是出于性能原因。看看 SphinxSearch 或 Solr 引擎。

于 2012-06-25T07:56:15.273 回答
1

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 不会返回任何值,但会(重新)动态创建一个名为 V_SEARCH_RESULTS 的视图。然后,您所要做的就是从此视图中进行选择以查看结果。

于 2012-06-06T22:26:32.170 回答
0

以下是基于上述帖子的语法,用于简单地运行 SELECT 语句,而不创建存储过程:

SET TERM ^ ;
EXECUTE BLOCK 
RETURNS
( table_with_value varchar(200),
    column_with_value varchar(200),
    containing_value varchar(4000))
AS
declare variable all_tables varchar(200);
declare variable all_columns varchar(200);
declare variable all_values varchar(4000);
BEGIN
    FOR SELECT
        r.rdb$relation_name, f.rdb$field_name
        from rdb$relation_fields f
        JOIN RDB$FIELDS ON (RDB$FIELDS.RDB$FIELD_NAME = f.RDB$FIELD_SOURCE)
        join rdb$relations r on f.rdb$relation_name = r.rdb$relation_name
        and r.rdb$view_blr is null 
        and (r.rdb$system_flag is null or r.rdb$system_flag = 0)
        and RDB$FIELDS.RDB$FIELD_TYPE in (37, 40)
        and RDB$FIELDS.RDB$FIELD_TYPE is not null
        order by 1, f.rdb$field_position INTO :all_tables, :all_columns
    DO
    BEGIN
        FOR EXECUTE STATEMENT 'SELECT "' || all_columns || '" FROM "' || all_tables || '"'
            INTO :all_values
        DO
        BEGIN
            IF (all_Values like '%SEARCH_VALUE%') THEN
            BEGIN
                table_With_Value = all_Tables;
                column_With_Value = all_Columns;
                containing_value = all_Values;
                SUSPEND;
           END
        END
    END
END^
SET TERM ^ ;
于 2022-02-09T23:13:42.757 回答