web-dev-qa-db-ja.com

mysqlで単一のキーワードを持つ単一のwhere条件を使用して、テーブルのすべての列を検索します

64の異なるフィールドで構成されるテーブルがあります。単一のキーワードで検索します。結果はどのフィールドのキーワードにも一致するはずです。いくつかの提案をします。

23
R J.
SELECT * FROM `some_table`
WHERE
CONCAT_WS('|',`column1`,`column2`,`column3`,`column4`,`column64`) # single condition, many columns
LIKE '%VT%'

出来上がり。

「|」ところで、セパレータは、たとえばcolumn1が 'V'で終わり、column2が 'T'で始まる偶然の一致を見つけないようにすることです。これにより、 "VT"の検索で誤検知が発生します。

上記のメソッドがORメソッドよりも速いかどうかはわかりませんが(同じ速度だと思います)、クエリを手書きで書いている場合は、タイピングが少なくなります。

11
Buttle Butkus

ORを使用して複数の条件でwhereを使用できます

お気に入り

where
name = 'expected'
OR rate ='expected' 
OR country ='expected'
5
NullPoiиteя

私はあなたのクエリが単純だが長い方法を回避する方法を見ることができません:

SET @term = "Somesearch";
SELECT id, title FROM sometable WHERE
    col1 LIKE '%@term%' OR
    col2 LIKE '%@term%' OR
    col3 LIKE '%@term%' ...;

MySQL変数を使用する代わりに、言語固有の変数を使用できますが、例のために、MySQL自体に固執すると思いました。

「...」は、他の61の列/フィールドを配置する場所です。

2
tdlm

別の可能性は、FOR XMLを使用してすべての列を単一のフィールドに印刷することです...

SELECT c.*
FROM (
SELECT a.*
,( SELECT *
   FROM table_to_search b
   WHERE a.KeyField = b.KeyField
   FOR XML RAW) AS `Full_Text_Record`
FROM table_to_search a) c
WHERE c.`Full_Text_Record` LIKE '%Search_string%'

特に大きなテーブルの場合、実行に時間がかかる場合がありますが、その文字列が特定のテーブルに存在するかどうかを徹底的に確認する必要があります。

2
processoriented

最も簡単な解決策は、複数のORsを使用することです。

select * from TAB where col1 like "%VAR%" OR col2 like "%VAR%" OR......col64 like "%VAR%";

要件に応じてlikeまたは=を使用できますが、新しい列を追加するたびにクエリを変更する必要があります。

別の方法として、SQLDump for that tableを取得してから、そのファイルをsearchで取得することもできます。

グーグルで、

  1. このプロジェクトが有用かどうかを確認します- http://code.google.com/p/anywhereindb/ 。すべてのフィールドを検索し、多くの人から賞賛されています。

  2. information_schemaテーブルの情報を使用してみてください。テーブル内のすべての列を探します。次に、この情報を使用してクエリを作成してみます。

1

このSQL Server構文をMySQLに変換できる場合

WHERE
name = @keyword OR
country = @keyword OR
department = @keyword OR
@keyword IS NULL -- match all when search text is empty
1
codingbiz

テーブル内のすべての列に対してクエリを生成するクエリを1つ作成できます。以下の例では、スキーマ(「所有者」)は「DEV_USER」です。64個のフィールドがあるテーブルは「CUSTOMER_INFO」と呼ばれます。検索の基準は、値が「VT」の任意の列です。

select 'SELECT ' || COLUMN_NAME || ' FROM CUSTOMER_INFO
WHERE '  || COLUMN_NAME || q'# LIKE '%VT%';#'
FROM ALL_TAB_COLS 
WHERE OWNER = 'DEV_USER'
AND TABLE_NAME = 'CUSTOMER_INFO'; 

この1つのクエリは、各フィールドのクエリを生成します。上記を実行した結果は次のようになります。

SELECT ADDRESS_1 FROM CUSTOMER_INFO
WHERE ADDRESS_1 LIKE '%VT%';

SELECT ADDRESS_2 FROM CUSTOMER_INFO
WHERE ADDRESS_2 LIKE '%VT%';

SELECT CITY FROM CUSTOMER_ADDRESSES_QASB
WHERE CITY LIKE '%VT%';

SELECT STATE_PROVINCE FROM CUSTOMER_INFO
WHERE STATE_PROVINCE LIKE '%VT%';

SELECT Zip_POSTAL_CODE FROM CUSTOMER_INFO
WHERE Zip_POSTAL_CODE LIKE '%VT%';
WHERE LATITUDE LIKE '%VT%';

... and so on for each column in the table

次に、最初のクエリから生成されたクエリを別のタブに貼り付けて実行します。

お役に立てば幸いです。 :-)

0
user2569747

動的SQLを使用して、すべての列を検索するクエリを生成および実行できます。

DELIMITER $$
CREATE PROCEDURE searchAllCols(inDB VARCHAR(64), inTable VARCHAR(64), search VARCHAR(32))
BEGIN
    SET @matches = (
        SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '` LIKE "%', search, '%"') SEPARATOR ' OR ')
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE table_name = inTable and table_schema = inDB);
    SET @query = CONCAT('SELECT * FROM `', inDB, '`.`', inTable, '` WHERE ', @matches);
    PREPARE stmt FROM @query;
    EXECUTE stmt;
END
$$
DELIMITER ;
CALL searchAllCols('table_to_search', 'searchString');
0
Barmar