1

PLSQL の IF/ELSE ステートメントを実行しようとしていますが、常にエラーが発生しているため、正しい方法で実行しているかどうかわかりません: IF に右括弧がありません (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 2)) != TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 2))) THEN しかし、括弧はバランスが取れているようです。

SELECT *
FROM
(
IF (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 2)) != TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 2))) THEN
  SELECT ID, DATE, ATTR_VALUE, (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4))-TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4))-48) DIFF
ELSE
  SELECT ID, DATE, ATTR_VALUE, (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4))-TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4))) DIFF
END IF
FROM Table A
ORDER BY TIME
)
WHERE DIFF>26

この問題について私を助けてください。

4

2 に答える 2

5

CASEステートメントを使用して結果を取得できるはずです。

SELECT *
FROM
(
  SELECT ID, 
    DATE, 
    ATTR_VALUE,
    CASE 
      WHEN TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 2)) != TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 2))
      THEN (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4))-TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4))-48)
      ELSE (TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4))-TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4)))
    END DIFF
  FROM Table A
  ORDER BY TIME
)
WHERE DIFF>26
于 2013-01-11T12:07:44.017 に答える
0

以下に示すように、クエリを行の何かに変更できます。

SELECT *
  FROM (SELECT ID,
               DATE,
               ATTR_VALUE,
               decode(TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 2)),
                      TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 2)),
                      TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4)) -
                      TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4)),
                      TO_NUMBER(SUBSTR(ATTR_VALUE, 6, 4)) -
                      TO_NUMBER(SUBSTR(ATTR_VALUE, 1, 4))) DIFF
          FROM A)
 WHERE diff > 26
于 2013-01-11T12:11:56.297 に答える