0

我有一张包含邮政地址的表格。我的查询如下所示:

SELECT "ID", postcode, numbertype, minnumber, maxnumber
INTO huidigPostcodeID_FK, databasePostcode, databaseNumberType, databaseMinNumber, databaseMaxNumber
FROM POSTCODE 
WHERE POSTCODE_ID = 79417568 AND (NUMBERTYPE = 'odd' OR NUMBERTYPE = 'mixed')

在大多数情况下,这可以正常工作,因为它只需要提供 1 行。如果有 2 个相同的记录(一个具有 numbertype = 奇数和另一个混合),则查询返回 2 行。

        ID POSTCODE NUMBERTYPE  MINNUMBER  MAXNUMBER
---------- -------- ---------- ---------- ----------
    395755 7941KD   odd                 9          9 
    395756 7941KD   mixed               1         22 

我不想要这个,因为我得到了一个错误。有人有一个解决方案,其中程序只得到一个 numbertype = 'mixed' 的记录吗?

因此,在上面的示例中,我只希望不显示此记录:

    ID POSTCODE NUMBERTYPE  MINNUMBER  MAXNUMBER

395756 7941KD   mixed               1         22 
4

2 回答 2

2

我认为人们也可以使用窗口函数来完成此操作:

SELECT "ID", postcode, numbertype, minnumber, maxnumber
  INTO huidigPostcodeID_FK, databasePostcode, databaseNumberType, databaseMinNumber, databaseMaxNumber
  FROM (
    SELECT "ID", postcode, numbertype, minnumber, maxnumber
         , ROW_NUMBER() OVER ( PARTITION BY postcode ORDER BY DECODE(numbertype, 'mixed', 0, 1) ) AS rn
      FROM postcode
     WHERE postcode_id = 79417568 AND (numbertype = 'odd' OR numbertype = 'mixed')
) WHERE rn = 1

在这种情况下,如果给定值 有两条记录postcode,它将选择值为 的numbertype记录'mixed'。人们也可以简单地ORDER BY numbertypeOVER( )子句中使用,但这并不像说'mixed'应该放在第一位那样明确。

希望这可以帮助。

于 2015-01-09T13:25:35.580 回答
0

您可以通过聚合来做到这一点。但目前还不清楚你想要什么。就像是:

SELECT min(id), postcode,
       (case when min(numbertype) = max(numbertype) then min(numbertype)
             else 'mixed'
        end)
       min(minnumber), max(maxnumber)
INTO huidigPostcodeID_FK, databasePostcode, databaseNumberType, databaseMinNumber, databaseMaxNumber
FROM POSTCODE 
WHERE POSTCODE_ID = 79417568 AND (NUMBERTYPE = 'odd' OR NUMBERTYPE = 'mixed')
GROUP BY postcode
于 2015-01-09T13:10:22.710 回答