plsql高级或条件

时间:2015-01-09 13:06:43

标签: sql oracle oracle11g or-operator

我有一张包含帖子地址的表格。 我的查询如下:

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 

2 个答案:

答案 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