2017-10-17 118 views
0

我有工作原理如下一个漂亮的SQL SELECT查询:检查多列多个值,SQL SELECT

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

这检索24条记录,因为它应该。现在的问题是,我有14个其他扩展来检查这两个相同的列中,我不知道如何查找多个列中的多个值。

比方说,前面的查询返回24,我做了与7201相同的查询,它返回6行。我想要一种能够在这种情况下返回30行的方式。对于7200到7213也是如此,因此要使用包含这些列的任意13个扩展名的时间戳的任何行。

有没有办法做到这一点?

我想是这样的:

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); 

,但我在所有

+0

你将不得不添加多个条款。你的SQL引擎(数据库)会优化它。您可以检查查询的执行计划。如果您的值都是数值,那么您可以应用范围条件。 – Acewin

+2

关于你的编辑:你需要使用OR(不是);这些'#in(x,y)'中只有两个(至多)在任何给定的时间都是真的,并且AND要求它们都是真的。 – Uueerdo

+0

'OR'仍然没有返回准确的结果,但下面的答案之一已经解决了它。谢谢! –

回答

1

得到任何记录我相当肯定没有用于检查“十字路口”之类的任何特定的语法,但是这将是最简单的。

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

旁注:在WHERE条件使用几乎所有的功能,如DATE(),会杀死你的查询的性能; ts >= '2017-10-16 00:00:00' AND ts < '2017-10-17 00:00:00'通常是一个更好的选择。

+0

我正在尝试这个,谢谢!另外,感谢时间戳提示,我一定会实现这一点 –

2

我真的认为这会更普遍被写为:

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

使用and如果每个应匹配的延伸。如果任何一方需要匹配,请使用or

1

您可以使用子查询:

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) 
;