2

テーブルのいずれかの列に文字列値が存在するかどうかを確認する必要があります。明示的な列名を作成せずにこの作業を実行するプロシージャまたはクエリをFirebirdで自動的に作成することは可能ですか?

列名は、次のクエリで見つけることができます。

RDB$RELATION_FIELDSからNCとしてRDB$RELATION_FIELDS.rdb$field_nameを選択します。ここでRDB$RELATION_FIELDS.rdb $ ratio_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

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 に答える
1

DBで全文検索が必要な場合は、Firebirdと統合された専用の検索エンジンを使用することをお勧めします。これはパフォーマンス上の理由によるものです。SphinxSearchまたはSolrエンジンを見てください。

于 2012-06-25T07:56:15.273 に答える
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 に答える