2010-03-02 14 views
11

Tengo una tabla con las siguientes columnas:¿Cómo puedo "seleccionar *" de una tabla en MySQL pero omitir ciertas columnas?

id,name,age,surname,lastname,catgory,active 

En lugar de: SELECT name,age,surname,lastname,catgory FROM table

¿Cómo puedo hacer algo como esto: SELECT * FROM table [but not select id,active]

+1

posible duplicado de [Seleccione todas las columnas excepto una en MySQL?] (Http://stackoverflow.com/questions/9122/select-all-columns-except-one-in-mysql) – tstenner

+0

@tstenner Sí, creo que este es un duplicado del que enlazó. Si bien este no ha sido respondido, creo que este tiene la [respuesta] mejor y más precisa (http://stackoverflow.com/a/13808457/1874069) otorgada por donl. – volderArt

Respuesta

7

La única manera de hacer eso, que yo sepa si es para enumerar cada columna que desea ... no hay filtros negativos de los que tenga conocimiento.

select name, age, surname, lastname, category from table 
+4

Suspiro, muchos votaciones ascendentes. – Kermit

2

no puede hacer eso, lo siento. De hecho, no lo habrías hecho si pudieras: especificar estas cosas explícitamente siempre es mejor, asumir que otro desarrollador agrega un nuevo campo y tu aplicación fallará

0

Estoy bastante seguro de que no puedes. Probablemente la mejor manera en que puedo pensar es crear SELECT name, age, surname, lastname, category FROM table como una vista, luego solo SELECT * FROM view. Prefiero siempre seleccionar de una vista de todos modos.

Sin embargo, como han señalado otros, si se agrega otra columna a la vista, su aplicación podría fallar. También en algunos sistemas (PostgreSQL es un candidato) no se puede alterar la tabla sin antes eliminar la vista, por lo que resulta un poco engorroso.

1

A menos que haya alguna extensión especial en MySql no puede hacer eso. O obtienes todo, o tienes que declarar explícitamente lo que quieres. Lo mejor es siempre nombrar columnas, ya que esto no alterará el comportamiento de la consulta incluso si la tabla subyacente cambia.

1

No hay sintaxis SQL para apoyar:

select * from table but not select id,active 

Si desea todos menos uno o más columnas, usted tiene que definir explícitamente la lista de columnas que desee.

1

No debe utilizar select * de todos modos. Enumere las columnas que desea y solo las columnas que desea, esa es la mejor práctica.

+0

lo sé, pero uso una nueva idea –

2

Usted es demasiado avanzado.

El único lenguaje de datos que he visto que es compatible con la sintaxis es la lengua D con su "... TODO PERO ..." construcción:

Wikipedia - D Language Specification

Hay algunas implementaciones de referencia disponibles, pero principalmente con fines didácticos.

17

Aunque muchos dicen que es una práctica recomendada enumerar explícitamente cada columna que desea devolver, hay situaciones en las que es posible que desee ahorrar tiempo y omitir ciertas columnas de los resultados (por ejemplo, pruebas). A continuación he dado dos opciones que resuelven este problema.

1.Crear una función que recupera todos los nombres de las columnas deseadas: (He creado un esquema denominado funciones para mantener esta función)

DELIMITER $$ 

CREATE DEFINER=`root`@`%` FUNCTION `getTableColumns`(_schemaName varchar(100), _tableName varchar(100), _omitColumns varchar(200)) RETURNS varchar(5000) CHARSET latin1 
BEGIN 
    SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns 
    WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,_omitColumns) = 0 ORDER BY ORDINAL_POSITION; 
END 

Crear y ejecutar instrucción de selección:

SET @sql = concat('SELECT ', (SELECT 
functions.getTableColumns('test', 'employees', 'age,dateOfHire')), ' FROM test.employees'); 
PREPARE stmt1 FROM @sql; 
EXECUTE stmt1; 

2. O sin escribir una función que podría:

SET @sql = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM 
information_schema.columns WHERE table_schema = 'test' AND table_name = 
'employees' AND column_name NOT IN ('age', 'dateOfHire')), 
' from test.eployees'); 
PREPARE stmt1 FROM @sql; 
EXECUTE stmt1; 

* Reemplazar prueba con su propio nombre de esquema

** reemplazar a los empleados con su propio nombre de la tabla

*** Reemplazar edad, dateOfHire con las columnas que desea omitir (se puede dejar en blanco para devolver todas las columnas o simplemente entrar en un nombre de columna para omitir)

** ** Se puede ajustar la longitud de las varchars en la función para satisfacer sus necesidades

1

SET @sql = concat ('SELECT', (SELECT REPLACE (GROUP_CONCAT (COLUMN_NAME), '', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '' Y TABLE_SCHEMA = ''), 'FROM');

PREPARE stmt1 FROM @sql; EJECUTAR stmt1;

Cuestiones relacionadas