2013-07-27 55 views
0

我不知道如何可以安装一个SQL尽可能实现可移植性,以查询表的所有列特定词组,如:MySQL查询检索表中的所有列的字符串

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

你说的“便携式”是什么意思? –

+0

对于许多MySQL版本 – Augusto

+0

如果该日期字段具有char或varchar数据类型,那么您是不明智的。如果它有一个日期或日期时间数据类型,它必须从这个尝试中排除。 –

回答

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; 

还测试(;-)。

+0

我测试脚本,但没有作品.... :(这里是一个链路测试,但感谢答复!: http://sqlfiddle.com/#!2/c9cf3/1 – Augusto

+0

@Augusto http://sqlfiddle.com/#!2/40f11/1 –

+0

@JoachimIsaksson工作得非常好!!!!非常感谢!!! – Augusto

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%" 
+0

我觉得还是被替换, –

+0

哎...添加:) –

+0

谢谢,但我没有做一个更加动态的SQL,比如上例中Postgres的... :) – Augusto

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进行搜索,因此即使按字段搜索,也不会从索引获得太多帮助:)

An SQLfiddle to test with

+0

谢谢,但我没有做一个更加动态的SQL,像Postgres的例子... :) – Augusto

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' 
相关问题