0

Postgres db でこのクエリを実行しようとしていますが、エラーが返されます: [Err] ERROR: syntax error at or near "," LINE 13: and not substr(a.zoneiddest , 1 ,3) = any ( 「254」、「255」、「256」...

クエはこんな感じ

SELECT
    to_char(a.CALLDATE, 'yyyymm') AS month,
    min(a.calldate) AS start_time,
    max(a.calldate) AS end_time,
    ceil(SUM(a.CALLDURATION::INT) / 60) AS minutes,
    COUNT(DISTINCT a.IDENTIFIANT) AS distinct_callers,
    a.zoneiddest AS country_code,
    b.country
FROM cdr_data a,
    country_codes b
WHERE a.CALLSUBCLASS = '002'
  AND a.CALLCLASS = '008'
  AND a.zoneiddest::INT > 0
  AND SUBSTR(a.CALLEDNUMBER, 1, 2) NOT IN
    ( '77', '78', '75', '70', '71', '41', '31', '39', '76', '79' )
  AND NOT substr(a.zoneiddest, 1, 3) = ANY
    ( '254', '255','256', '211', '257', '250', '256' )
  AND trim(a.zoneiddest) = trim(b.country_code)
GROUP BY
    to_char(a.CALLDATE, 'yyyymm'),
    a.zoneiddest,
    b.country
ORDER BY 1

この同じクエリは、a.zoneiddest::integer > 0 を a.zoneiddest > 0 に少し変更するだけで、Oracle でもうまく機能します。

私は何が間違っているのでしょうか

4

2 に答える 2

2

問題はANYオペレーターにあります。クエリを正しく理解していれば、それをNOT INステートメントに置き換えることができます。

SELECT to_char (a.CALLDATE,'yyyymm') as month,min(a.calldate) as 
start_time,max(a.calldate) as end_time,
ceil(SUM (a.CALLDURATION::integer) / 60) AS minutes,
COUNT (DISTINCT a.IDENTIFIANT) AS distinct_callers,
a.zoneiddest as country_code,b.country
FROM cdr_data a,COUNTRY_CODES b
WHERE  a.CALLSUBCLASS = '002'
AND  a.CALLCLASS = '008'
and a.zoneiddest::integer > 0
AND SUBSTR (a.CALLEDNUMBER, 1, 2) NOT IN
  ('77', '78', '75', '70', '71', '41', '31', '39', '76','79')
// This line
AND substr(a.zoneiddest , 1 ,3) NOT IN
  ('254','255','256','211','257','250','256')
// End of line
and trim(a.zoneiddest)  = trim(b.country_code)
GROUP BY to_char (a.CALLDATE,'yyyymm') ,a.zoneiddest,b.country
ORDER BY 1
于 2013-01-14T10:39:10.147 に答える
1

次のようにキーワード any をパラメーター配列と組み合わせて使用​​してみてください。

= any (ARRAY['254','255','256','211','257','250','256'])
于 2013-01-14T10:45:33.793 に答える