-1

このT-SQLクエリをOracleに変換するにはどうすればよいですか?

if((select case 
       when (select  top 1 AlertMessage   
             from ims.dbo.alertlist 
             where SystemID=@meter 
             order by TimePeriod desc
            ) like '%NO_COMMUNICATION_Resolved' then 1 
       else 0 end)=1)
begin
     INSERT INTO [ims].[dbo].[alertlist]
          ([SiteID],[ThresholdNumber],[SystemID],
           [AlertMessage],[TimePeriod],[AlertType],[PollID]) 
     VALUES 
          (1,@thresnumber,@meter,@message,getdate(),1,0)
end
4

1 に答える 1

0

Dan Puzeyが指摘したように、あなたの質問は広すぎて、多くの試行錯誤が必要になります。しかし、私はあなたの問題の最初の部分を解決するかもしれない何かであなたを正しい軌道に乗せるように努めます。

DECLARE v_IsMessageResolved int;

-- This query will retrieve the value of the first row returned by the sub-query, mimicking the TOP 1 of SQL Server, and it will store the value of MessageResolved in a Variable
SELECT
  MessageResolved into v_IsMessageResolved
FROM
  (
  -- This query will return 1 for all the Messages that match the LIKE clause, ordered by TimePeriod in descending order.
  SELECT
    CASE
      WHEN AlertMessage LIKE '%NO_COMMUNICATION_Resolved' THEN 1
      ELSE 0
    END AS MessageResolved
    ,RANK() OVER (ORDER BY TimePeriod DESC) AS MessageRank
  FROM
    ims.alertlist 
  WHERE
    (SystemID = :meter)
  )
WHERE
  (MessageRank = 1)

-- At this point, it will be a matter of checking the value of v_IsMessageResolved and, if it's "1", run the INSERT

私はSQLServerをよく知っていますが、Oracleを使用したことがないため、ソリューションが完全ではない可能性があります(または、テストする環境がないため、まったく実行されない可能性があります)。これは、私が行ったように、簡単な検索で残りの質問に対する答えを見つけることができることも意味します。:)

于 2012-08-07T14:35:05.447 に答える