【问题标题】:Search and find a string value in all columns在所有列中搜索并找到一个字符串值
【发布时间】:2012-06-06 08:48:13
【问题描述】:

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

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

选择 RDB$RELATION_FIELDS.rdb$field_name 作为 NC from RDB$RELATION_FIELDS 其中 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的方法?

【问题讨论】:

  • 您可以使用执行语句并将字符串传递给它firebirdsql.org/refdocs/langrefupd21-psql-execstat.html
  • 如果我使用执行字符串(我的变量“sqlCommand”)Firebird 引发了以下异常“ISC ERROR CODE:335544928”
  • 但是返回字符串是正确的。我也在 sql shell 中尝试过这个: EXECUTE STATEMENT (EXECUTE PROCEDURE P_FINDSTRINGINTABLE ('str', 'myTable') ) 但不起作用。 :(
  • 你能告诉我你的数据库的默认字符集吗?

标签: sql select firebird


【解决方案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 的视图。然后,您所要做的就是从此视图中进行选择以查看结果。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        • 1970-01-01
        • 2018-07-27
        相关资源
        最近更新 更多