2013-07-27 53 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' 
相關問題