mysql sql select query-optimization

mysql - Verificando mĂșltiples columnas por un valor



select query-optimization (3)

Tengo una tabla que tiene columnas como esta, por ejemplo:

id,col1,col2,col3,col4

Ahora, quiero verificar si ANY de col1, col2, col3, col4 tiene el valor pasado.

El largo camino para hacerlo sería ...

SELECT * FROM table WHERE (col1 = 123 OR col2 = 123 OR col3 = 123 OR col4 = 123);

Supongo que es la versión opuesta de IN .

¿Hay una manera más fácil de hacer lo que quiero?


Podría hacer algo como: (Nota: Asumiendo que las columnas son valores numéricos. Y, solo en el caso de que el valor concatenado cree la secuencia de caracteres que está buscando, use un delimitador para distinguir los valores de la columna. Pipe (|) es el delimitador en este ejemplo.)

SELECT [ID] ,[Col1] ,[Col2] ,[Col3] ,[Col4] FROM [Table1] WHERE ''123'' IN ( CAST([Col1] AS VARCHAR) + ''|'' + CAST([Col2] AS VARCHAR) + ''|'' + CAST([Col3] AS VARCHAR) + ''|'' + CAST([Col4] AS VARCHAR) + ''|'' )


Puede usar el predicado IN , así:

SELECT * FROM table WHERE 123 IN(col1, col2, col3, col4);

Demostración de SQL Fiddle

es la versión opuesta de IN.

No, no lo es , es lo mismo que usar los OR la forma en que lo hizo en su pregunta.

Para aclarar esto:

El predicado IN o set membership se define como 1 :

Donde la Value Expression puede ser 2 :

Entonces está bien hacerlo de esta manera, usando la expresión de valor 123 , que es un literal.

1, 2: Imágenes de: Consultas SQL para simples mortales (R): una guía práctica para la manipulación de datos en SQL


Tuve un problema similar y lo resolví de esta manera: SELECT * FROM table WHERE col1 OR col2 IN(SELECT xid FROM tablex WHERE somecol = 3)

No estoy seguro si es "la mejor manera" pero funciona para mí.

¿Pensamientos?