2012-07-13 52 views
8

Estoy intentando seleccionar varias columnas, pero no todas, de la base de datos. Todas las columnas que quiero seleccionar van a comenzar con "palabra".Comodines en el nombre de columna para MySQL

Así que en pseudocódigo que 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 retiro los registros. Todas las palabras se unirán como una cadena y pasarán a otra función en una matriz/diccionario con su identificador.

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

Ok, aquí hay otra pregunta para ustedes:

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

+0

¿No sería más fácil usar filas en lugar de columnas? –

+0

Bueno, el problema con eso, y puede ser el diseño de mi base de datos (ha sido un dolor de cabeza en este proyecto), es que entonces necesitaría una fila para CADA palabra, y un valor asociado, y no lo hago quiero eso ya que estas palabras están relacionadas. Serán parte de la misma consulta a la API. Otros, con un identificador diferente será una consulta diferente. –

+2

Si tiene una nueva pregunta, use una nueva. Los que responden no son notificados de que usted edite esta publicación, y mucho menos de que la haya editado para hacer otra pregunta. –

Respuesta

8

No, SQL no proporciona ninguna sintaxis para realizar dicha selección.

Lo que puede hacer es primero pedir a MySQL para a list of column names, 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 las columnas. A continuación, puede hacer, en Python:

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

En lugar de utilizar la concatenación de cadenas, recomendaría el uso de SQLAlchemy en lugar de hacer la generación de SQL para usted.

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

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

+0

¿No sería esto, en términos prácticos, la lista exacta que tuve que usar? –

+0

Sí, pero deberá usar Python para luego construir el SQL final; no existe una forma pura de SQL de implementar su consulta psuedocode. –

1

No, no puede generar dinámicamente la lista de columnas que se seleccionarán. Tendrá que estar codificado en tu 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 satisfagan la condición.

+0

Vea más arriba para los nombres de las columnas: http://stackoverflow.com/a/11466826/1091386 – icedwater

1

Puede generar la lista de nombres de columna primero usando

SHOW COLUMNS IN tblname LIKE "word%" 

a continuación, recorrer el cursor y generar instrucción SQL utiliza todas las columnas de la consulta anterior.

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

Esto podría ser útil: MySQL wildcard in select

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 columnas de la tabla con una consulta inicial (http://dev.mysql.com/doc/refman/5.0/en/show-columns.html) y luego comparar en python si el nombre coincide con su patrón. Luego puede hacer la instrucción de selección de MySQL con los nombres de columna encontrados como este:

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