Buscar todas las columnas de una tabla usando una única condición where con palabra key única en mysql

Tengo una tabla que consta de 64 campos diferentes. Voy a search con una sola palabra key, los resultados deben coincidir con la palabra key de cualquier campo. Da algunas sugerencias

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

Voila.

El '|' separador, por cierto, es para evitar que encuentre coincidencias coincidentes donde, por ejemplo, la columna 1 termina en 'V' y la columna2 comienza con 'T', lo que le daría un falso positivo en la búsqueda de "VT".

No estoy seguro si el método anterior es más rápido que el método OR (supongo que tienen la misma velocidad), pero definitivamente implica less tipeo si estás escribiendo la consulta a mano.

puede usar el lugar con múltiples condiciones con OR

me gusta

 where name = 'expected' OR rate ='expected' OR country ='expected' 

No puedo ver una forma de evitar que tu consulta sea simple, pero larga:

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

En lugar de usar una variable de MySQL, puedes usar una variable específica del idioma pero, por el bien de los ejemplos, pensé que me quedaría con MySQL.

El "…" es donde colocarías las otras 61 columnas / campos.

Otra posibilidad sería usar FOR XML para get todas las columnas para imprimir en un solo campo … así:

 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%' 

Podría tomar un time para ejecutarse si se trata de una tabla particularmente grande, pero debería obligarte a descubrir si esa cadena existe en una tabla determinada.

Si puede traducir esta syntax de SQL Server a MySQL

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

La solución más simple sería usar múltiples ORs .

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

Puede usar like o = según el requisito, pero requerirá cambiar su consulta cada vez que agregue una nueva columna.

Como alternativa, puede tomar SQLDump for that table y luego search ese file.

Con Google,

  1. Vea si este proyecto es útil: http://code.google.com/p/anywhereindb/ . Búsquedas en todos los campos y alabado por muchos.

  2. Intenta usar la información de information_schema tabla information_schema . Busque todas las columnas en la tabla. Ahora, intente formar su consulta utilizando esta información.

Podría escribir una consulta que generará una consulta para cada columna en su tabla. En el ejemplo siguiente, el esquema ("propietario") es "DEV_USER". La tabla con sus 64 campos se llama "CUSTOMER_INFO". El criterio en la búsqueda es cualquier columna con un valor de 'VT' en ella:

 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'; 

Esta consulta generará una consulta para cada campo por usted. Los resultados de ejecutar lo anterior serían;

 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 

Luego, simplemente pegue esas consultas generadas desde su primera consulta en otra pestaña y ejecútelas.

Espero que ayude. 🙂

Puede usar SQL dynamic para generar y ejecutar una consulta que busque todas las columnas.

 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); PREPARE stmt FROM CONCAT('SELECT * FROM `', inDB, '`.`', inTable, '` WHERE ', @matches); EXECUTE stmt; END $$ CALL searchAllCols('table_to_search', 'searchString');