我有一张包含帖子地址的表格。 我的查询如下:
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个相同的recors(一个有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
答案 0 :(得分: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 numbertype
条款中使用OVER( )
,但这并不是明确表示'mixed'
应该先出现。
希望这有帮助。
答案 1 :(得分: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