0

私はこのクエリを持っています

select devlocview.ENTERPRISENAME
FROM AlarmDeviceView alrmDevView
INNER JOIN devicelocationview devLocView 
    ON devlocview.oid=alrmdevview.deviceoid
LEFT OUTER JOIN DEVICEGROUPVIEW devGrpView 
    ON devlocview.oid=devgrpview.deviceoid
LEFT OUTER JOIN RackCapacityView rackCapView 
    ON devlocview.RACKID=rackCapView.oid
WHERE 
(
    alrmdevview.createddate = ( select max(alview.createddate) 
                                from alarmdeviceview alview 
                                WHERE alview.alarmoid=alrmdevview.alarmoid) 
    or alrmdevview.createddate IS NULL
)
AND devlocview.ENTERPRISENAME='Enterprise1'
AND devlocview.buildingname in (
CASE
WHEN $p{building} IS  not NULL THEN $p{building}
WHEN $p{building} IS  NULL THEN (select buildingname from cdmr.devicelocationview)
END
)

ここで、この部分"select buildingname from cdmr.devicelocationview"は複数の行を返します。

01427としての例外。00000-「単一行のサブクエリは複数の行を返します」

要件に従って、複数の建物を割り当てたい場合$p{building} is null

4

2 に答える 2

1

ACASEはスカラー式であり、スカラー値に評価される必要があります。複数行のセットを返すために使用することはできません。

入力値がNULLであるかどうかに基づいて条件を変更するために私が見た最も一般的なイディオムは、次のようになります。

AND (  ( $p{building} IS NOT NULL AND devlocview.buildingname = $p{building} )
       OR
       ( $p{building IS NULL AND devlocview.buildingname IN (SELECT buildingname FROM  cdmr.devicelocationview ) )
    )
于 2012-08-01T12:10:07.303 に答える
1

試す

AND 1 = case 
         when $p{building} IS  not NULL 
         and devlocview.buildingname = $p{building}
         then 1
         when $p{building} IS NULL
         AND  devlocview.buildingname in (select buildingname from cdmr.devicelocationview)
         then 1
         else 0
        end

それ以外の

when devlocview.buildingname in (
CASE
WHEN $p{building} IS  not NULL THEN $p{building}
WHEN $p{building} IS  NULL THEN (select buildingname from cdmr.devicelocationview)
END
)
于 2012-08-01T12:43:53.447 に答える