我需要查找表中任何列中是否存在字符串值。 可以在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命令作为字符串返回。
是否有自动执行返回选择的方法????
答案 0 :(得分: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的视图。您只需从此视图中选择以查看结果即可。
答案 1 :(得分:1)
如果您需要在数据库中进行全文搜索,建议您使用与Firebird集成的专用搜索引擎。这是出于性能原因。 看看SphinxSearch或Solr引擎。