Oracle SQL 演算子

演算子とは、SELECT文等の中でデータ項目にある種の操作を行い、異なる値を結果として返させるものです。


算術演算子

演算子には、算術演算子、文字列結合演算子、集合演算子があります。算術演算子はいわゆる四則演算のためのものでプログラム言語で使用されている演算子と同様で、単項演算子と二項演算子に分けられます。単項演算子は"-","+"のみでデータ項目の直前につけてその値を反転もしくは同じ値を返す働きをします。二項演算子はいわゆるA+B、A-Bという2つのデータ項目の四則演算を行うものです。演算子の優先順位は以下の表の様になります。

演算子 操作 優先順位
単項演算子 +、- 同一、反転
二項演算子 *、/ 乗算、除算
二項演算子 +、- 加算、減算

式の中で同じ優先順位のものは左から右に評価されます。また、式の中で括弧”()”を使用することで括弧の中が先に評価されます。以下に、算術演算子の働きをリテラル値を使った例を示します。例からもわかるように、データ項目がNULLの場合は演算結果がNULLになります。この点は注意が必要だと思います。

SQL> SELECT
  2   1 + 2 AS T1
  3  ,1 - 2 AS T2
  4  ,10 * 20 AS T3
  5  ,10 / 20 AS T4
  6  ,(1 + 2) * 2 AS T5
  7  ,-(1 + 2) * 2 AS T6
  8  ,1 + NULL AS T7
  9  ,10 * NULL AS T8
 10  ,-NULL AS T9
 11  FROM DUAL;

        T1         T2         T3         T4         T5         T6         T7         T8         T9
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
         3         -1        200         .5          6         -6

上の例は、リテラル値を使いましたので、今度はテーブルの列に対しての演算子の例を示します。最初に元となるテーブルを表示します。

SQL> SELECT * FROM TM_商品;

商品コード 商品名                                   商品区分               仕入単価   売上単価
---------- ---------------------------------------- -------------------- ---------- ----------
         1 PC-9001                                  デスクトップパソコン      65000      98000
         2 PC-9002                                  デスクトップパソコン      95000     120000
         3 PC-9003                                  デスクトップパソコン     150000     190000
         4 NOTE-1010                                ノートパソコン           125000     188000
         5 NOTE-1020                                ノートパソコン           145000     200000
         6 NOTE-1030                                ノートパソコン           155000     220000
         7 PRT-3001                                 プリンタ                  45000      88000
         8 PRT-4001                                 プリンタ                 115000     180000
         9 CRT-1001                                 ディスプレイ              45000      78000
        10 CRT-2001                                 ディスプレイ              55000      98000
        11 HUB-A001                                 ネットワーク              20000      40000
        12 HUB-B001                                 ネットワーク              40000      60000

12行が選択されました。

TM_商品の売上単価を1.05倍し、その値が10,000円より大きいものを検索するSQL文を示しています。

SQL> SELECT 商品コード,売上単価,売上単価 * 1.05 FROM TM_商品
  2  WHERE 売上単価 * 1.05 > 100000;

商品コード   売上単価 売上単価*1.05
---------- ---------- -------------
         1      98000        102900
         2     120000        126000
         3     190000        199500
         4     188000        197400
         5     200000        210000
         6     220000        231000
         8     180000        189000
        10      98000        102900

8行が選択されました。

演算子はSELECT文のみではなくUPDATE文であっても以下の様に使用可能です。

SQL> UPDATE TM_商品
  2  SET 売上単価 = 売上単価 * 1.05
  3  WHERE 売上単価 * 1.05 > 100000;

8行が更新されました。


文字列結合演算子

連結演算子は以下の様に文字列カラムを連結するための演算子です。実線縦バーを2個で連結演算子を示します。C言語で言うところの論理演算子のORと同じものです。演算子で結合された結果は文字データを返します。

SQL> SELECT '商品コード=' || 商品コード , '商品名(' || 商品名 || ')' FROM TM_商品
  2  ORDER BY 商品コード;

'商品コード='||商品コード                           '商品名('||商品名||')'
--------------------------------------------------- ------------------------------------------------
商品コード=1                                        商品名(PC-9001)
商品コード=2                                        商品名(PC-9002)
商品コード=3                                        商品名(PC-9003)
商品コード=4                                        商品名(NOTE-1010)
商品コード=5                                        商品名(NOTE-1020)
商品コード=6                                        商品名(NOTE-1030)
商品コード=7                                        商品名(PRT-3001)
商品コード=8                                        商品名(PRT-4001)
商品コード=9                                        商品名(CRT-1001)
商品コード=10                                       商品名(CRT-2001)
商品コード=11                                       商品名(HUB-A001)
商品コード=12                                       商品名(HUB-B001)

12行が選択されました。

NULLである項目をNULLでは無いリテラル文字列と連結すると結果はNULLにはならず、NULLの項目を空文字''として連結されます。以下に例を示します。

SQL> UPDATE TM_商品 SET 商品名 = NULL
  2  WHERE 商品コード=12;

1行が更新されました。

SQL> SELECT '商品コード=' || 商品コード , '商品名(' || 商品名 || ')' FROM TM_商品
  2  WHERE 商品コード=12;

'商品コード='||商品コード                           '商品名('||商品名||')'
--------------------------------------------------- ------------------------------------------------
商品コード=12                                       商品名()

しかし、Oracleの説明では以下の様にNULLの可能性がある場合にはNVL関数を使用して明示的に空文字としたほうが良い様です。

SQL> SELECT '商品コード=' || 商品コード , '商品名(' || NVL(商品名,'') || ')' FROM TM_商品
  2  WHERE 商品コード=12;

'商品コード='||商品コード                           '商品名('||NVL(商品名,'')||')'
--------------------------------------------------- ------------------------------------------------
商品コード=12                                       商品名()

尚、NULL同士のカラムを連結すると結果はNULLを返します。以下のテストではNULL結合がNULLであることを確認しています。

SQL> SELECT NVL(NULL || NULL ,'IS NULL') FROM DUAL;

NVL(NUL
-------
IS NULL

ページのトップへ戻る