Tengo una bonita consulta de selección SQL que funciona de la siguiente manera:

select * from session
where date(ts) = '2017-10-16'
and 7200 in (callingpartyno,finallycalledpartyno);

Esto recupera 24 registros como debería. El problema ahora es que tengo otras 14 extensiones para verificar dentro de esas mismas 2 columnas y no sé cómo buscar valores múltiples dentro de varias columnas.

Digamos que la consulta anterior devuelve 24 y hago la misma consulta con 7201 y devuelve 6 filas. Quiero una forma que devuelva 30 filas en ese caso. Lo mismo ocurre con 7200 a 7213, por lo que para extraer cualquier fila con esa marca de tiempo que tenga CUALQUIERA de esas 13 extensiones en CUALQUIERA de esas columnas.

¿Hay alguna manera de hacer esto?

Intenté así:

select * from ambition.session 
where date(ts) = '2017-10-16'
and 7276 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7314 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7295 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7306 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7357 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7200 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO) 
and 7218 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7247 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7331 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO) 
and 7255 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7330 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7000 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7215 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7240 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7358 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
and 7312 in (CALLINGPARTYNO, FINALLYCALLEDPARTYNO);

Pero no tengo ningún registro

0
Tom N. 17 oct. 2017 a las 19:10

3 respuestas

La mejor respuesta

Estoy bastante seguro de que no hay ninguna sintaxis específica para verificar "intersecciones" como esa, pero esto sería más simple.

... AND (callingpartyno IN (the list) OR finallycalledpartyno IN (the list))

Nota al margen: el uso de casi cualquier función en una condición WHERE, como DATE(), matará el rendimiento de su consulta; ts >= '2017-10-16 00:00:00' AND ts < '2017-10-17 00:00:00' suele ser una opción mucho mejor.

1
Uueerdo 17 oct. 2017 a las 16:15

Realmente creo que esto se escribiría más comúnmente como:

where date(ts) = '2017-10-16' and
      (CALLINGPARTYNO in (7276, . . .) or  -- I think the OP wants either one to match
       FINALLYCALLEDPARTYNO in (7276, . . .)
      );

Use and si cada uno debe coincidir con una extensión. Use or si cualquiera de los dos necesita coincidir.

2
Gordon Linoff 17 oct. 2017 a las 16:20

Puedes usar una subconsulta:

SELECT *
FROM ambition.session s
  CROSS JOIN (
      SELECT 7276 e UNION
      SELECT 7314 UNION
      SELECT 7295 UNION
      SELECT 7306 UNION
      SELECT 7357 UNION
      SELECT 7200 UNION 
      SELECT 7218 UNION
      SELECT 7247 UNION
      SELECT 7331 UNION 
      SELECT 7255 UNION
      SELECT 7330 UNION
      SELECT 7000 UNION
      SELECT 7215 UNION
      SELECT 7240 UNION
      SELECT 7358 UNION
      SELECT 7312) ext
WHERE date(ts) = '2017-10-16'
AND e.ext IN (CALLINGPARTYNO, FINALLYCALLEDPARTYNO)
;
1
Serge 17 oct. 2017 a las 16:22