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?