我想知道如何将SQL尽可能地移植到查询特定短语的表的所有列,例如:
表格
ID | Name | text | Date | Author | Status
1 | Augusto Weiand | Test text | 2010-01-01 | Deividi | 1
查询
SELECT *
FROM table
WHERE columns LIKE '%augusto%2010%text%"
我没有提供足够的细节,对不起,我喜欢制作动态SQL,我不需要用'AND'或'OR'来指定列,因为它可以在Postgres中执行:
Select *
From table
Where table::text ~~ '%augusto%2010%text%'
答案 0 :(得分:1)
试试这个
Select * FROM table WHERE text LIKE "%text%"
OR date LIKE "%2010%"
OR Name LIKE "%augusto%"
如果你想要它们,那么使用AND
Select * FROM table WHERE text LIKE "%text%"
AND date LIKE "%2010%"
AND Name LIKE "%augusto%"
答案 1 :(得分:1)
这是可行的,虽然我 强烈 建议你研究全文搜索的效率;
为了避免逐个查找所有字段中的所有模式,您只需连接并搜索;
SELECT *
FROM (SELECT id,CONCAT(name,'|',text,'|',date,'|',author,'|',status) txt
FROM Table1) a
WHERE txt LIKE '%augusto%'
AND txt LIKE '%2010%'
AND txt LIKE '%text%';
请注意,没有索引可以帮助您,因为您正在搜索计算列。另一方面,由于您使用前导通配符%searchterm
进行搜索,即使逐字段搜索,您也无法获得索引的帮助:)
答案 2 :(得分:1)
以下是如何在动态SQL中连接值:
set @Pattern = '%augusto%';
select @q := concat('select * from Table1 ',
'where concat(', group_concat(column_name), ', "") like "', @Pattern, '"'
)
from information_schema.columns c
where table_name = 'Table1';
prepare st from @q;
execute st;
deallocate prepare st;
当然,动态SQL不是特别便携。这个想法适用于大多数数据库。代码看起来会有所不同。
经过测试和工作here。
最后,你可以通过变量替换来做到这一点(这是更好的方法):
select @q := concat('select * from Table1 ',
'where concat(', group_concat(column_name), ', "") like ?'
)
from information_schema.columns c
where table_name = 'Table1';
set @p = '%augusto%';
prepare st from @q;
execute st using @p;
deallocate prepare st;
还测试了(; - )。
答案 3 :(得分:1)
您可以使用此商店过程搜索表
中所有列中的文本CREATE PROCEDURE dbo.sp_FindStringInTable @stringToFind VARCHAR(100),
@schema
sysname, @table sysname
AS
BEGIN TRY
DECLARE @sqlCommand varchar(max) = 'SELECT * FROM [' + @schema + '].[' +
@table + '] WHERE '
SELECT @sqlCommand = @sqlCommand + '[' + COLUMN_NAME + '] LIKE ''' +
@stringToFind + ''' OR '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @schema
AND TABLE_NAME = @table
AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar')
SET @sqlCommand = left(@sqlCommand,len(@sqlCommand)-3)
EXEC (@sqlCommand)
PRINT @sqlCommand
END TRY
BEGIN CATCH
PRINT 'There was an error. Check to make sure object exists.'
PRINT error_message()
END CATCH
像这样执行
EXEC sp_FindStringInTable '%searchword%','schema_name', 'tablename'