2012-09-24 10 views
5

estoy mapeo de datos de una tabla de MySQL y tienen una tabla que tiene más de 50 columnas y más de 100.000 filas, y tengo que trazar una columna que tiene datos en él que tiene 4 caracteres o menos.¿Cómo puedo devolver todas las columnas en una tabla que contiene solo datos con cuatro caracteres o menos?

¿Cómo puedo obtener una lista de todas las columnas de la tabla que tienen datos que contiene sólo cuatro caracteres o menos? En mi caso, todas las columnas son varchar (255).

+0

Mi primera sugerencia fue http://sqlfiddle.com/#!2/f3573/1, pero después de leer su pregunta nuevamente, no es tan simple ;-) –

+0

Lo siento, mi pregunta original no estaba clara, edité arriba –

+0

¿Nombres de columna o con datos? – Sami

Respuesta

0

Esto le dará las columnas cuyo nombre tiene 4 o menos caracteres:

SHOW COLUMNS FROM table WHERE CHAR_LENGTH(Field) < 5 

en SQL anterior sólo hay que reemplazar table con el nombre de su mesa, Field es un literal debe mantener de esa manera.

ACTUALIZACIÓN:
Si desea contenido de la columna con 4 o menos caracteres, entonces se puede desea:

select * from table where CHAR_LENGTH(column_name) < 5 
+0

Gracias, eso es útil en sí mismo, pero no me refiero a los * nombres * de las columnas, sino a los * datos * en las propias columnas, p. el origen de destino tiene una columna que espera códigos con cuatro caracteres o menos y quiero mapear esto tan inteligentemente como pueda mediante la búsqueda de columnas cuyos datos cumplan este criterio. –

+0

Ok, he actualizado mi respuesta para cubrir eso también. – Nelson

+0

Eso está más cerca de una solución, pero de alguna manera necesito obtener todas las columnas de la tabla, verificar todos los datos en cada columna y devolver el nombre de la columna solo si todos los datos cumplen los criterios de que tiene 4 caracteres o menos. –

1
SELECT 
    COLUMN_NAME 

FROM INFORMATION_SCHEMA.COLUMNS 

WHERE TABLE_NAME = <table> 
AND CHAR_LENGTH(COLUMN_NAME) <= 4 
+0

Gracias, pero no quise decir los * nombres * de las columnas, sino los * datos * en las columnas mismas. –

0

Creo que se necesita para crear una consulta dinámica utilizando la información de INFORMATION_SCHEMA.COLUMNS , luego ejecuta eso. No probado, pero algo como:

SET @s = 'SELECT GROUP_CONCAT(X) AS FOUR_CHAR_COLS, ID FROM (' + 
     (SELECT GROUP_CONCAT('SELECT CASE WHEN CHAR_LENGTH(`' + COLUMN_NAME + 
     '`) <= 4 THEN ''' + COLUMN_NAME + ''' ELSE NULL END AS X, ID FROM MyTableName' 
      SEPARATOR ' UNION ALL ') 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE TABLE_NAME = 'MyTableName') + 
    ') XX GROUP BY ID'; 

PREPARE stmt FROM @s; 
EXECUTE stmt; 

Esto debe enumerar todas las columnas en cada fila que tienen 4 caracteres o menos.

0

Se puede hacer mediante el procedimiento almacenado.

  1. Seleccionar todos los nombres de columna, que son de importancia de mesa y almacenan en la tabla temporal;
  2. Iterar con WHILE o REPEAT bucle a través de ellos y realizar LONGITUD SELECT (COLUMN_NAME) de la tabla.
Cuestiones relacionadas