Comodines en nombre de columna para MySQL

Estoy tratando de seleccionar varias columnas, pero no todas las columnas, de la base de datos. Todas las columnas que quiero seleccionar van a comenzar con “word”.

Así que en pseudocódigo me gustaría hacer esto:

SELECT "word%" from searchterms where onstate = 1; 

Más o menos. No encuentro ninguna documentación sobre cómo hacer esto, ¿es posible en MySQL? Básicamente, estoy tratando de almacenar una lista de palabras en una sola fila, con un identificador, y quiero asociar todas las palabras con ese identificador cuando extraigo los registros. Todas las palabras se unirán como una cadena y se pasarán a otra función en una matriz / diccionario con su identificador.

Estoy tratando de hacer POCAS llamadas de base de datos como sea posible para mantener el código rápido.

Ok, aquí hay otra pregunta para ustedes:

Habrá un número variable de columnas con el nombre “palabra” en ellas. ¿Sería más rápido hacer una llamada a la base de datos por separado para cada fila, con una consulta Python generada por fila, o sería más rápido simplemente SELECCIONAR *, y solo utilizar las columnas que necesitaba? ¿Es posible decir SELECCIONAR * NO XYZ?

No, SQL no le proporciona ninguna syntax para hacer tal selección.

Lo que puede hacer es pedir primero a MySQL una lista de nombres de columna , luego generar la consulta SQL a partir de esa información.

 SELECT column_name FROM information_schema.columns WHERE table_name = 'your_table' AND column_name LIKE 'word%' 

vamos a seleccionar los nombres de columna. Entonces puedes hacerlo, en Python:

 "SELECT * FROM your_table WHERE " + ' '.join(['%s = 1' % name for name in columns]) 

En lugar de usar concatenación de cadenas, recomendaría usar SQLAlchemy en lugar de hacer la generación de SQL por usted.

Sin embargo, si todo lo que está haciendo es limitar el número de columnas, no hay necesidad de hacer una consulta dinámica como esta. El trabajo duro para la base de datos es seleccionar las filas; no hace mucha diferencia enviarte 5 columnas de cada 10, o todas las 10.

En ese caso, solo use "SELECT * FROM ..." y use Python para seleccionar las columnas del conjunto de resultados.

No, no puede producir dinámicamente la lista de columnas que se seleccionarán. Tendrá que ser codificado en su consulta final.

Su consulta actual produciría un conjunto de resultados con una columna y el valor de esa columna sería la cadena "word%" en todas las filas que satisfacen la condición.

Puede generar la lista de nombres de columna primero usando

 SHOW COLUMNS IN tblname LIKE "word%" 

Luego haga un bucle a través del cursor y genere una instrucción SQL que use todas las columnas de la consulta anterior.

 "SELECT {0} FROM searchterms WHERE onstate = 1".format(', '.join(columns)) 

Esto podría ser útil: MySQL comodín en seleccionar

En conclusión no es posible en MySQL directamente.

Lo que podría hacer como una solución sucia es obtener todos los nombres de columna de la tabla con una consulta inicial ( http://dev.mysql.com/doc/refman/5.0/en/show-columns.html ) y luego comparar Python si el nombre coincide con su patrón. Después, podría hacer la statement de selección de MySQL con los nombres de las columnas encontradas de esta forma:

 SELECT word1, word2, word3 from searchterms where onstate = 1;