その他の関数

Virtual DataPort でサポートされているその他の関数

COALESCE

説明

COALESCE 関数は、NULL でない最初の引数を返します。 COALESCE は、次の式と同等です。

CASE WHEN arg1 IS NOT NULL THEN arg1
     WHEN arg2 IS NOT NULL THEN arg2
     
END

構文

COALESCE( <field name:identifier>, <field name:identifier> [, <field name:identifier> ]*)
  • field name: NULL の可能性があるテキストまたはフィールド名。

V というビューについて考えてみます。

a

b

c

10.10

I am some text

21-ene-2005 0h 0m 0s

-80.10

Text is $% needed always

12-mar-2005 12h 30m 0s

20.50

Text for a living

01-feb-2006 16h 45m 0s

40.05

NULL

NULL

例 1

SELECT COALESCE(b, 'hello')
FROM V

coalesce

I am some text

Text is $% needed always

Text for a living

hello

例 2

SELECT coalesce('hello', 'bye')
FROM v

coalesce

hello

hello

hello

hello

例 3

SELECT COALESCE(b, a)
FROM V

coalesce

I am some text

Text is $% needed always

Text for a living

40.05

CONTEXTUALSUMMARY

説明

CONTEXTUALSUMMARY 関数は、テキストについて、指定された語または文を含む、関連性のあるテキストフラグメントを返します。

構文

CONTEXTUALSUMMARY( <content:text>, <keyword:text>, [ <begin delim:text>,
    <end delim:text>, <fragment separator:text>, <fragment length:int>
    [, <max fragments number:int> [, <analyzer:text> ] ] ] )
  • content: 必須。最も関連性の高いフラグメントの抽出元のテキスト。

  • keyword: 必須。テキストフラグメントを抽出するために使用されるキーワード。この引数には 1 語または 1 文を内容として含めることができます。

  • begin delim: オプション。テキスト内に出現した場合に常にキーワードの接頭辞として追加するテキスト。デフォルト値は「」です。

  • end delim: オプション。テキスト内に出現した場合に常にキーワードの接尾辞として追加するテキスト。デフォルト値は「」です。

  • fragment separator: オプション。結果の各テキストフラグメントを区切るためのテキスト。デフォルト値は「...」です。

  • fragment length: オプション。テキスト内のキーワード出現箇所の前後に現われる文字のおおよその数。デフォルト値は 5 です。

  • max fragment number: オプション。取得するフラグメントの最大数。

  • analyzer: オプション。キーワードの検索に使用するアナライザー。デフォルトでは、標準アナライザー (std) が使用されます。このアナライザーは、見出し語化やストップワードを考慮しません。Virtual DataPort には、英語用 (en) とスペイン語用 (es) のアナライザーが同梱されています。

例 1

SELECT CONTEXTUALSUMMARY(content, 'Denodo', '<b>', '</b>', ' … ', 5, 1)
FROM demo_arn_view;

このクエリは、「Denodo」という語が出現するテキスト content のフラグメントを返します。

例 2

次のビュー text_summary_sample について考えてみます。

text_sample

A web service (also webservice) is defined by the W3C as a software system designed to support interoperable machine-to-machine interaction over a network. It has an interface described in a machine-processable format (specifically Web Services Description Language WSDL). Other systems interact with the web service in a manner

prescribed by its description using SOAP messages, typically conveyed using HTTP with an XML serialization in conjunction with other web-related standards. Web services are frequently just Internet Application Programming Interfaces (API) that can be accessed over a network, such as the Internet, and executed on a remote system hosting the requested services. Other approaches with nearly the same functionality

as web services are Object Management Group’s (OMG) Common Object Request

Broker Architecture (CORBA), Microsoft’s Distributed Component Object Model

(DCOM) or Sun Microsystems’s Java/Remote Method Invocation (RMI).

SELECT contextualsummary(text_sample, 'system')
FROM text_summary_sample

contextualsummary

system

system

例 3

SELECT contextualsummary(text_sample, 'service')
FROM text_summary_sample

contextualsummary

service ... service

例 4

SELECT contextualsummary(text_sample, 'web', '\', '/', '--', 25)
FROM text_summary_sample

contextualsummary

A web/ service (also-- (specifically Web/ Services-- with the web/ service

with other web/-related

as web/ services

GETSESSION

説明

GETSESSION 関数は、Virtual DataPort サーバーとの間で確立されたセッションの情報を提供します。

構文

GETSESSION( <parameter : literal> )
  • parameter には以下の いずれか を指定できます (この関数によって返される値は、このパラメーターに応じて異なります)。

    1. user: 現在のユーザーのユーザー名を返します。

    2. useragent: 現在のコネクションに関連付けられたユーザーエージェントを返します。

    3. database: クライアントの接続先 Virtual DataPort データベースの名前を返します。

    4. i18n: クライアントの接続先データベースのロケール構成の名前を返します。

    5. roles: 現在のユーザーに割り当てられている有効なロールの名前が含まれる配列を返します。有効なロールとは、ユーザーに直接的および間接的に割り当てられているロールです。たとえば、「user1」にロール「A」が割り当てられていて、ロール「A」がロール「B」に割り当てられている場合、この関数は「A」および「B」を返します。

SELECT GETSESSION('user') || '@' || GETSESSION('database') as user_name
FROM Dual();

user_name

user1@denodo_samples_db

HASH

説明

HASH 関数は、MD5 アルゴリズムを使用して入力値のダイジェストを計算し、それを base64 (base 16 ではありません) でエンコードして返します。

この関数は、同じ入力に対しては常に同じ値を返します。

入力パラメーターが NULL の場合は、NULL を返します。

構文

HASH( <value:text> ):text
  • value: 必須。フィールドまたはリテラルの名前。

SELECT hash('text value') as hash_value, hash(null) as null_value
FROM Dual()

hash_value

null_value

eNV9lLZhJ1lex1ztvwnajg==

NULL

IS_PROJECTED_FIELD

説明

IS_PROJECTED_FIELD 関数は、パラメーターとして渡されたフィールドが投影されている場合 (つまり、フィールドがクエリの SELECT ステートメント内にある場合)、 true を返します。それ以外の場合は False を返します。

構文

IS_PROJECTED_FIELD( <field name:literal> ):boolean
  • field name: 必須。フィールドの名前。大文字と小文字の違いを含め完全に一致する名前である必要があります。このパラメーターが NULL の場合、この関数は false を返します。

次のビュー items について考えてみます。

item

price

A

3.45

B

9.99

C

4.99

例 1

SELECT item, IS_PROJECTED_FIELD('item')
FROM items

item

is_projected_field

A

true

B

true

C

true

例 2

SELECT sum(price) AS total, IS_PROJECTED_FIELD('price')
FROM items

total

is_projected_field

18.43

true

この例では、クエリによってフィールド price に関数が適用されていますが、このフィールドが投影されているため、 IS_PROJECTED_FIELDtrue を返します。

例 3

SELECT item, IS_PROJECTED_FIELD('price')
FROM items

item

is_projected_field

A

false

B

false

C

false

この例では、クエリはフィールド price を投影していないため、 IS_PROJECTED_FIELDfalse を返します。

例 4

SELECT item AS field1, IS_PROJECTED_FIELD('field1')
FROM items

field1

is_projected_field

A

false

B

false

C

false

この例では、 IS_PROJECTED_FIELD は、フィールドの別名ではなく、ビューのフィールドが投影されているかどうかをチェックするので、 false を返します。

MAP

説明

MAP 関数は、キーに関連付けられた値を返します。キー/値のペアはビューまたはマップから取得できます (「 マップの定義 」を参照)。キーが存在しない場合、この関数は NULL を返します。

使用可能なシグネチャは 2 つあります。

構文 1

MAP ( <key:text>, <view name:text>, <key field:text>,
    <value field:text> )

キーに関連付けられた値を取得します。MAP はビューの列でキーの値を検索します。

  • key: 必須。ビューで検索する値。

  • view name: 必須。キーとその値を含むビューの名前。

  • key field: 必須。キーを含むビューの列。

  • value field: 必須。値を含むビューの列。

構文 2

MAP ( <key:text>, <map name:text> [, <i18n:text> ] )

マップからキーに関連付けられた値を取得します。

  • key: 必須。マップで検索する値。

  • map name: 必須。キーとその値を含むマップの名前。

  • i18n: オプション。コンテンツのロケール構成。

注釈

どちらの場合も、 key は大文字と小文字が区別されるパラメーターです。

例 1

food というマップについて考えてみます。

CREATE MAP SIMPLE food (
    'breakfast' = 'milk'
    'dinner' = 'lettuce'
    'lunch' = 'meat'
)
SELECT MAP('breakfast', 'food') AS breakfast
    , MAP('lunch', 'food') AS lunch
    , MAP('dinner', 'food') AS dinner
    , MAP('none', 'food') AS none
FROM Dual()

breakfast

lunch

dinner

none

milk

meat

lettuce

NULL

例 2

各国の会社の収益がその国の通貨で含まれる FOREIGN_SALES というビューについて考えてみます。

country

month

revenue

currency

Mexico

JAN

7536.00

MXN

Spain

JAN

20000.00

EUR

United Kingdom

JAN

26816.00

GBP

Canada

FEB

-25616.00

CAD

Japan

FEB

100024.00

JPY

さらに、各通貨とドルの為替レートを含む CURRENCY_RATES_TO_USD というマップについて考えてみます。

CREATE MAP SIMPLE currency_rates_to_usd (
    'CAD' = '0.957121'
    'EUR' = '1.4971'
    'GBP' = '1.67'
    'JPY' = '0.011166'
    'MXN' = '0.076989'
    'USD' = '1.0'
);
SELECT month
    , country
    , CAST('float', MAP(CURRENCY, 'currency_rates_to_usd')) * revenue AS revenue_usd
FROM foreign_sales

month

country

revenue_usd

JAN

Mexico

580.19

JAN

Spain

29942.00

JAN

United Kingdom

44782.72

FEB

Canada

-24517.61

FEB

Japan

1116.87

NULLIF

説明

NULLIF 関数は、2 つの値または式を比較して、2 つが等しければ NULL を返し、そうでなければ最初の値を返します。

この関数は、次のステートメントと同等です。

CASE WHEN <expression> = <expression>
    THEN NULL
    ELSE <expression>
END

NULLIF は暗黙的な型変換を実行します。つまり、2 つのパラメーターが異なる型の場合、比較のために一方の型変換を試みます

例: 最初のパラメーターが 1 (text)、2 番目のパラメーターが 1 (integer) の場合、 text パラメーターを整数に変換します。これらは型が異なっていても等しいとみなされます。

構文

NULLIF(<expression>, <expression>)

internet_inc というビューについて考えてみます。

id

summary

ttime

taxid

1

Error in ADSL router

2005-06-29 19:19:41.0

B78596011

2

Incident in ADSL router

2005-06-29 19:19:41.0

B78596012

3

Install additional line

2005-06-29 19:19:41.0

B78596013

4

Bandwidth increase

2005-06-29 19:19:41.0

B78596014

例 1

SELECT NULLIF(id, 1) AS display
FROM internet_inc

display

NULL

2

3

4

例 2

SELECT *
FROM internet_inc
WHERE NULLIF(ID, 1) <> NULL

id

summary

ttime

taxid

2

Incident in ADSL router

2005-06-29 19:19:41.0

B78596012

3

Install additional line

2005-06-29 19:19:41.0

B78596013

4

Bandwidth increase

2005-06-29 19:19:41.0

B78596014

このビューの最初の行は条件に一致しません。

例 3

SELECT COALESCE(NULLIF(ID, '1'), summary) AS display
FROM internet_inc

display

Error in ADSL router

2

3

4

注釈

NULLIF は 2 番目のパラメーターを自動的に整数に変換し、それを同じく整数である ID 列の値と比較します。

ROWNUM

説明

ROWNUM 関数は、クエリの結果の各行に対して一意の数値を返します。

この数値は、データが異なるソースから取得されていても、各クエリで一意です。

ORDER BY 句は、 ROWNUM が各行に値を割り当てた後に処理されます。

1 つのクエリを何度実行しても一貫した結果が得られるようにするには、ビューに対して ROWNUM()ORDER BY 句とともに使用します。

構文

ROWNUM( [ <offset:long > ] ):long
  • offset: オプション。指定されている場合、 ROWNUM によって返される最初の値は 1 ではなく、(offset + 1) です。

internet_inc というビューについて考えてみます。

id

summary

ttime

taxid

1

Error in ADSL router

2005-06-29 19:19:41.0

B78596011

2

Incident in ADSL router

2005-06-29 19:19:41.0

B78596012

3

Install additional line

2005-06-29 19:19:41.0

B78596013

4

Bandwidth increase

2005-06-29 19:19:41.0

B78596014

例 1

SELECT rownum(10), summary, taxid
FROM internet_inc

rownum

summary

taxid

11

Error in ADSL router

B78596011

12

Incident in ADSL router

B78596012

13

Install additional line

B78596013

14

Bandwidth increase

B78596014

例 2

SELECT ROWNUM(), summary, taxid
FROM internet_inc
ORDER BY summary

rownum

summary

taxid

4

Bandwidth increase

B78596014

1

Error in ADSL router

B78596011

2

Incident in ADSL router

B78596012

3

Install additional line

B78596013

「例 2」のクエリでは、結果をフィールド summary で並べ替えている点に注意してください。 ORDER BY 句は ROWNUM 関数が各行に値を割り当てた後に処理されるため、 ROWNUM の最初の値は 1 にはなりません。