在所有列中搜索并找到一个字符串值

3
我需要查找一个字符串值是否存在于我的表中的任何列中。 有可能在Firebird中创建自动过程或查询来执行此操作,而不必显式指定列名吗?
可以使用以下查询查找列名:
select RDB$RELATION_FIELDS.rdb$field_name as NC from RDB$RELATION_FIELDS where 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命令作为字符串。
有没有自动执行返回的select语句的方法?

你可以使用执行语句并将字符串传递给它 http://www.firebirdsql.org/refdocs/langrefupd21-psql-execstat.html - Mariuz
如果我执行字符串(我的变量“sqlCommand”),Firebird 会引发以下异常:“ISC ERROR CODE:335544928”。 - Danilo
然而返回的字符串是正确的。 我在 SQL shell 中也尝试了这个:EXECUTE STATEMENT (EXECUTE PROCEDURE P_FINDSTRINGINTABLE ('str', 'myTable') ),但没有起作用。 :( - Danilo
请问您的数据库的默认字符集是什么? - moskito-x
3个回答

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

1

以下是基于以上帖子的语法,用于简单运行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 ^ ;

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的视图。然后你只需要从这个视图中选择来查看结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接