5 検索条件
検索条件には、選択、更新または削除する行を選択するための条件を指定します。検索条件は、INSERT...SELECT、UPDATEなどのDML文、およびCREATE VIEWなどの一部のDDL文の句や式に指定できるパラメータです。
検索条件の一般的な構文
検索条件は、単一の条件、または論理演算子ANDやORによって連結された複数の条件です。条件は、式においてTRUE、FALSE、UNKNOWNとして評価される処理です。行に対して条件がTRUEと評価された場合、その行はそれ以降の処理対象になります。条件がFALSEまたはNULLと評価された場合、行は処理対象とはなりません。
SQL構文
[NOT]
{BetweenPredicate | ComparisonPredicate | InPredicate |
LikePredicate | NullPredicate | InfinitePredicate | NaNPredicate |
QuantifiedPredicate |(SearchCondition)}
[{AND | OR} [NOT]
{BetweenPredicate | ComparisonPredicate | InPredicate |
LikePredicate | NullPredicate | QuantifiedPredicate | (SearchCondition)}
] [...]パラメータ
| 構成要素 | 説明 |
|---|---|
|
|
論理演算子には、次のものがあります。
|
|
|
式が一定の値の範囲に含まれているかどうかを判断します。たとえば、 |
|
|
|
|
|
指定したセット内の要素と式(または式のリスト)が一致するかどうかを判断します。 |
|
|
副問合せが行を返すかどうかを判断します。 |
|
|
特定の文字列パターンが式に含まれているかどうかを判断します。 |
|
|
値が |
|
|
式が無限大(正または負の無限大)であるかどうかを判断します。 |
|
|
式が演算での未定義の結果(非数)であるかどうかを判断します。 |
|
|
指定したセットと式(または式のリスト)に特定の関係があるかどうかを判断します。 |
|
( |
前述のいずれかの条件をカッコで囲みます。 |
説明
-
検索条件の条件は、次のように評価されます。
-
カッコで囲んだ条件は、最初に評価されます。
-
NOTは、各条件に対して適用されます。 -
ANDは、右側の条件に、左から右の方向に適用されます。 -
ORは、末尾の条件に、左から右の方向に適用されます。
図5-1は、論理演算によって算出される値を示します。疑問符(
?)は、NULL値を示します。 -
-
行の検索条件が
NULLと評価された場合、行は検索条件を満たさないため処理対象になりません。 -
互換性のあるデータ型のみを比較できます。
-
TT_TINYINT、TT_SMALLINT、TT_INTEGER、TT_BIGINT、NUMBER、BINARY_FLOATおよびBINARY_DOUBLEは、互換性があります。 -
CHAR、VARCHAR2、BINARYおよびVARBINARYは、長さに関係なく互換性があります。 -
CHAR、VARCHAR2、NCHAR、NVARCHAR2、TT_TIME、DATEおよびTIMESTAMPは、互換性があります。
-
-
比較演算時の値の拡張については、「式」を参照してください。
-
TimesTenで互換性のある異なるデータ型の値が比較される方法については、「数値データ型」を参照してください。
ALL/ NOT IN条件(副問合せ)
ALLまたはNOT IN条件は、副問合せが返すすべての値と同じ方法で比較の左側のオペランドを比較する必要があることを示します。ALL条件は、式(または式のリスト)が、副問合せによって返されるすべての行と、比較演算子で指定したとおりの関係である場合にTRUEと評価されます。同様に、NOT IN条件は、式(または式のリスト)が副問合せによって返される値と一致しない場合にTRUEと評価されます。
SQL構文
RowValueConstructor{CompOpALL | NOT IN} (Subquery)
RowValueConstructorの構文は、次のとおりです。
RowValueConstructorElement| (RowValueConstuctorList) |Subquery
RowValueConstructorListの構文は、次のとおりです。
RowValueConstructorElement[{,RowValueConstructorElement} ... ]
RowValueConstructorElementの構文は、次のとおりです。
Expression | NULL
CompOpの構文は、次のとおりです。
{= | <> | > | >= | < | <= }パラメータ
説明
-
ALL条件では、0(ゼロ)行以上の行を返し、キーワードALLを使用して変更される比較演算子を使用します。TimesTenで互換性のある異なるデータ型の値が比較される方法については、「数値データ型」を参照してください。 -
RowValueConstructorListが指定されている場合は、演算子=および<>のみを使用できます。
例
副問合せのあるNOT INの例です。
SELECT * FROM customers WHERE cid NOT IN (SELECT cust_id FROM returns) AND cid > 5000; SELECT * FROM customers WHERE cid NOT IN (SELECT cust_id FROM returns) AND cid NOT IN (SELECT cust_id FROM complaints); SELECT COUNT(*) From customers WHERE cid NOT IN (SELECT cust_id FROM returns) AND cid NOT IN (SELECT cust_id FROM complaints);
exclBookList以外の本または価格が$20より高いすべての本を選択する例を示します。
SELECT * FROM books WHERE id NOT IN (SELECT id FROM exclBookList) OR books.price>20;
次の問合せは、job_history表からemployee_idおよびjob_idを返します。この例では、NOT IN条件に式のリストおよび副問合せを使用しています。
Command> SELECT employee_id, job_id FROM job_history
WHERE (employee_id, job_id)
NOT IN (SELECT employee_id, job_id FROM employees);
< 101, AC_ACCOUNT >
< 101, AC_MGR >
< 102, IT_PROG >
< 114, ST_CLERK >
< 122, ST_CLERK >
< 176, SA_MAN >
< 200, AC_ACCOUNT >
< 201, MK_REP >
8 rows found.ALL/ NOT IN条件(値リスト)
ALL / NOT IN限定条件は、指定された値のリストと式(または式のリスト)を比較します。ALL条件は、ValueListのすべての値が、式(または式のリスト)と比較演算子で指定された関係にある場合にTRUEと評価されます。同様に、NOT IN条件は、式(または式のリスト)が、指定されたリスト内の値のいずれとも一致しない場合にTRUEと評価されます。
SQL構文
RowValueConstructor{CompOpALL | NOT IN}ValueList
RowValueConstructorの構文は、次のとおりです。
RowValueConstructorElement| (RowValueConstructorList) |
RowValueConstructorListの構文は、次のとおりです。
RowValueConstructorElement[{,RowValueConstructorElement} ... ]
RowValueConstructorElementの構文は、次のとおりです。
Expression | NULL
CompOpの構文は、次のとおりです。
{= | <> | > | >= | < | <= }
ValueListの要素が1つの場合の構文は、次のとおりです(カッコは不要です)。
ConstantExpression
ValueListの要素が複数ある場合の構文は、次のとおりです。
({ConstantExpression} [,...] )
ValueListが空の場合の構文は、次のとおりです。
( )
パラメータ
| 構成要素 | 説明 |
|---|---|
|
|
取得する値を指定します。 |
|
|
定数値または定数値になる式(数字、文字列、日付など)を指定します。バインドされた値( |
|
|
等しい。 |
|
|
異なる。 |
|
|
より大きい。 |
|
|
以上。 |
|
|
未満。 |
|
|
以下。 |
|
|
|
|
|
値のリストは
|
説明
-
Expressionの値がXで、(a,b, ..., z)がValueListの要素、OPが比較演算子の場合は、次の関係が成立します。-
X OP ALL (a,b,...,z)は、X OP a AND X OP b AND...AND X OP zと同じです。
-
-
Expressionの値がXで、(a,b,..., z)がValueListの要素である場合は、次の関係が成立します。-
X NOT IN (a,b,...,z)は、NOT (X IN (a,b,...,z))と同じです。
-
-
すべての文字データ型は、
NLS_SORTセッション・パラメータの現在の値に従って比較されます。 -
TimesTenで互換性のある異なるデータ型の値が比較される方法については、「数値データ型」を参照してください。
-
ALLを設定した、NOT INまたはNOT EXISTSを、OR式で指定できます。 -
ALLを設定した、INまたはEXISTSを、OR式で指定できます。 -
空の
ValueListを評価すると、ExpressionNOT INの結果はTRUEになります。 -
RowValueConstructorListが指定されている場合は、演算子=および<>のみを使用できます。
例
NOT IN条件で空の選択リストを問い合せる例を示します。
SELECT * FROM t1 WHERE x1 NOT IN ();
ValueListの例は、「ANY/IN条件(値リスト)」の例の項を参照してください。
ANY/ IN条件(副問合せ)
ANY条件は、比較演算子を使用して2つの式を比較します。最初の式が、副問合せによって返されるすべての行と、比較演算子で指定したとおりの関係である場合、条件はTRUEと評価されます。同様に、IN条件は、表の副問合せと式(または式のリスト)を比較します。式(または式のリスト)が副問合せによって返された値と等しい場合、IN条件はTRUEと評価されます。
SQL構文
RowValueConstructor{CompOpANY | IN} (Subquery)
RowValueConstructorの構文は、次のとおりです。
RowValueConstructorElement| (RowValueConstructorList) |Subquery
RowValueConstructorListの構文は、次のとおりです。
RowValueConstructorElement[{,RowValueConstructorElement} ... ]
RowValueConstructorElementの構文は、次のとおりです。
Expression | NULL
CompOpの構文は、次のとおりです。
{= | <> | > | >= | < | <= }パラメータ
説明
ANY条件では、0(ゼロ)行以上の行を返し、キーワードANYを使用して変更される比較演算子を使用します。TimesTenで互換性のある異なるデータ型の値が比較される方法については、「数値データ型」を参照してください。
例
この例では、1件以上の未発送の発注がある顧客のリストを取得します。
SELECT customers.name FROM customers WHERE customers.id = ANY (SELECT orders.custid FROM orders WHERE orders.status = 'unshipped');
これは、副問合せを含むIN条件の例です。1件以上の未発送の発注がある顧客をSELECT文で選択します。
SELECT customers.name FROM customers WHERE customers.id IN (SELECT orders.custid FROM orders WHERE orders.status = 'unshipped');
この例では、IN条件に副問合せを指定する集計問合せを使用して、exclBookListにある本の最高価格を検索します。
SELECT MAX(price) FROM books WHERE id IN (SELECT id FROM exclBookList);
IN条件および副問合せに式のリストを使用した例を示します。
SELECT * FROM t1 WHERE (x1,y1) IN (SELECT x2,y2 FROM t2);
ANY条件および副問合せに式のリストを使用した例を示します。
SELECT * FROM t1 WHERE (x1,y1) < ANY (SELECT x2,y2 FROM t2);
次に、ANY条件に式のリストを使用した例を示します。
Command> columnlabels on; Command> SELECT * FROM t1; X1, Y1 < 1, 2 > < 3, 4 > 2 rows found. Command> SELECT * FROM t2; X2, Y2 < 3, 4 > < 1, 2 > 2 rows found.
ANY/ IN条件(値リスト)
ANY または IN限定条件は、指定された値のリストと式(または式のリスト)を比較します。ANY条件は、ValueListの1つ以上の値が、式(または式のリスト)と比較演算子で指定された関係にある場合にTRUEと評価されます。同様に、IN条件は、式(または式のリスト)が、指定されたリスト内の値のいずれかと一致する場合にTRUEと評価されます。
SQL構文
RowValueConstructor {CompOp {ANY | SOME} | IN} ValueList
RowValueConstructorの構文は、次のとおりです。
RowValueConstructorElement | (RowValueConstructorList) |
RowValueConstructorListの構文は、次のとおりです。
RowValueConstructorElement[{, RowValueConstructorElement} ... ]
RowValueConstructorElementの構文は、次のとおりです。
Expression | NULL
CompOpの構文は、次のとおりです。
{= | <> | > | >= | < | <= }
ValueListの要素が1つの場合の構文は、次のとおりです(カッコは不要です)。
ConstantExpression
ValueListの要素が複数ある場合の構文は、次のとおりです。
({ConstantExpression} [,...] )
ValueListが空の場合の構文は、次のとおりです。
( )
パラメータ
| 構成要素 | 説明 |
|---|---|
|
|
取得する値を指定します。 |
|
|
定数値または定数値になる式(数字、文字列、日付など)を指定します。バインドされた値( |
|
|
等しい。 |
|
|
異なる。 |
|
|
より大きい。 |
|
|
以上。 |
|
|
未満。 |
|
|
以下。 |
|
{
|
|
|
|
値のリストは
|
説明
-
Expressionの値がXで、(a,b, ..., z)がValueListの要素、OPが比較演算子の場合は、次の関係が成立します。-
X OP ANY (a,b,...,z)は、X OP a OR X OP b OR...OR X OP zと同じです。
-
-
Expressionの値がXで、(a,b,..., z)がValueListの要素である場合は、次の関係が成立します。-
X IN (a,b,...,z)は、X = a OR X = b OR...OR X = zと同じです。
-
-
すべての文字データ型は、
NLS_SORTセッション・パラメータの現在の値に従って比較されます。 -
TimesTenで互換性のある異なるデータ型の値が比較される方法については、「数値データ型」を参照してください。
-
空の
ValueListを評価すると、ExpressionINの結果はFALSEになります。
例
項目100、200または300の発注が含まれている項目番号をすべて選択します。
SELECT DISTINCT OrderItems.ItemNumber FROM OrderItems WHERE OrderItems.Quantity = ANY (100, 200, 300)
重量が12、16、17の部品の番号を検索します。
SELECT Parts.PartNumber FROM Parts WHERE Parts.Weight IN (12, 16, 17);
シリアル番号が'1123-P-01'、'1733-AD-01'、:SerialNumberまたは:SerialIndである部品の部品番号を検索します。:SerialNumberと:SerialIndは動的パラメータで、その値は実行時に指定されます。
SELECT PartNumber FROM Purchasing.Parts
WHERE SerialNumber
IN ('1123-P-01', '1733-AD-01',:SerialNumber, :SerialInd);
次の例では、IN条件で空の選択リストを問い合せます。
SELECT * FROM t1 WHERE x1 IN ();
次の例では、INを使用した式のリストを使用します。
SELECT * FROM t1 WHERE (x1,y1) IN ((1,2), (3,4));
次の3つの例は、ttIsqlを使用した、定数式の使用を示しています。表TにはNUMBER型の列Xが1つあり、次のデータがあります。
Command> SELECT * FROM t; < 1 > < 2 > < 3 > < 4 > < 5 > 5 rows found.
最初の例は、問合せで定数式を使用します。
Command> SELECT x FROM t WHERE x in (abs(1-2), TO_NUMBER('1')+2, 3);
< 1 >
< 3 >
2 rows found.
2番目の例は、動的パラメータも使用します。
Command> SELECT x FROM t WHERE x = ANY (1+?, 1+3, ?); Type '?' for help on entering parameter values. Type '*' to end prompting and abort the command. Type '-' to leave the parameter unbound. Type '/;' to leave the remaining parameters unbound and execute the command. Enter Parameter 1 '_QMARK_1' (NUMBER) > 1 Enter Parameter 2 '_QMARK_2' (NUMBER) > 5 < 2 > < 4 > < 5 > 3 rows found.
3番目の例は、NULLも使用します。
Command> SELECT x FROM t WHERE x IN (null, 1, 3+1, 2); < 1 > < 2 > < 4 > 3 rows found.
次の例では、DATE型の列MYDATEが1つあり、次のデータを持つ表T_DATEを考慮します。
Command> SELECT * FROM t_date; < 2013-08-13 00:00:00 > < 2013-08-14 00:00:00 > < 2013-08-15 00:00:00 > 3 rows found.
この例では、日付の定数式を使用します。
Command> SELECT mydate FROM t_date
WHERE mydate IN (DATE '2013-08-12'+1,
DATE '2013-08-12'+2);
< 2013-08-13 00:00:00 >
< 2013-08-14 00:00:00 >
2 rows found.
次の例では、VARCHAR2(32)型の列COL1が1つあり、次のデータを持つ表MYCHARSを考慮します。
Command> SELECT * FROM mychars; < abc > < def > < ghi > 3 rows found.
この例は、定数式を戻す関数のコールを使用します。
Command> SELECT col1 FROM mychars WHERE col1 IN (ltrim('abcdef', 'abc'));
< def >
1 row found.
次に、IN条件に式のリストを使用した例を示します。この問合せは、DEPARTMENT_ID = 240およびLOCATION_ID = 1700である部門のDEPARTMENT_NAMEを返します。
ノート:
IN条件の右側の式は、二重カッコ(( ))で囲む必要があります。
Command> SELECT department_name FROM departments
WHERE (department_id, location_id) IN ((240,1700));
< Government Sales >
1 row found.BETWEEN条件
BETWEEN条件では、値が次のとおりであるかどうかを判断します。
-
2番目の値以上であること
および
-
3番目の値以下であること
値が指定した範囲内にあれば条件はTRUEと評価されます。
SQL構文
Expression1[NOT] BETWEENExpression2ANDExpression3
パラメータ
| パラメータ | 説明 |
|---|---|
|
|
構文の詳細は、「式の指定」を参照してください。 |
説明
-
2番目の値が3番目の値より大きい場合、
BETWEENではFALSEと評価され、NOT BETWEENではTRUEと評価されます。 -
BETWEENまたはNOT BETWEENのExpression2またはExpression3のどちらかがNULLの場合については、次の表を参照してください。Expression2 Expression3 BETWEEN NOT BETWEEN <=Expression1NULLNULLNULL>Expression1NULLFALSETRUENULL>=Expression1NULLNULLNULL<Expression1NULLNULL -
Expression2とExpression3では、対象にする値の範囲を決定します。指定の範囲内で、Expression2は対象にする最小の値で、Expression3は対象にする最大の値です。BETWEEN条件では、小さい値を先に指定する必要があります。比較の詳細は、「比較条件」を参照してください。
-
BETWEEN条件は、NCHAR型ではサポートされません。
例
$250.00以下および$1500.00以上の価格の部品を25%割り引きます。
UPDATE Purchasing.Parts SET SalesPrice = SalesPrice * 0.75 WHERE SalesPrice NOT BETWEEN 250.00 AND 1500.00;
比較条件
比較条件は、比較演算子を使用して2つの式を比較します。最初の式が2番目の式と、比較演算子で指定したとおりの関係である場合に、条件はTRUEと評価されます。
SQL構文
RowValueConstructorCompOpRowValueConstructor2
RowValueConstructorの構文は、次のとおりです。
RowValueConstructorElement| (RowValueConstructorList) |ScalarSubquery
RowValueConstructorListの構文は、次のとおりです。
RowValueConstructorElement[{,RowValueConstructorElement} ... ]
RowValueConstructor2 (1つの式)の構文は、次のとおりです。
Expression
RowValueConstructor2 (式のリスト)の構文は、次のとおりです。
((Expression[,...]))
CompOpの構文は、次のとおりです。
{= | <> | > | >= | < | <= }パラメータ
説明
-
すべての文字データ型は、
NLS_SORTセッション・パラメータの現在の値に従って比較されます。 -
RowValueConstructorListが指定されている場合は、演算子=および<>のみを使用できます。 -
TimesTenで互換性のある異なるデータ型の値が比較される方法については、「数値データ型」を参照してください。
-
比較条件の片方の辺が
UNKNOWNまたはNULLと評価された場合、これは条件および条件の否定のいずれもTRUEではないことを意味します。 -
NULL値自体は演算子または条件のオペランドとして直接使用できます。たとえば、
(1 = NULL)比較がサポートされます。これは、(1 = CAST(NULL AS INT))のように、NULLを適切なデータ型にキャストする場合と同じです。両方の方法がサポートされ、同じ結果を返します。
例
20日未満の期間で配送する必要のある部品の番号を検索します。
SELECT PartNumber FROM Purchasing.SupplyPrice WHERE DeliveryDays < 20;
この問合せは、salary=9500かつcommission_pct=.25である従業員のlast_nameを返します。
ノート:
等号の右側の式は、二重カッコ(( ))で囲む必要があります。
Command> SELECT last_name FROM employees
WHERE(salary,commission_pct) = ((9500,.25));
< Bernstein >
1 row found.
この問合せは、manager_id = 205である従業員のlast_nameを返します。従業員のdepartment_idおよびmanager_idは、employeesとdepartmentsの両方の表に格納されています。departments表から情報を抽出するには、副問合せを使用します。
Command> SELECT last_name FROM employees
WHERE (department_id, manager_id) =
(SELECT department_id, manager_id FROM departments
WHERE manager_id = 205);
< Gietz >
1 row found.EXISTS条件
EXISTS条件は、表の副問合せの有無を確認します。EXISTSの場合は副問合せで1行以上を返す場合、NOT EXISTSの場合は行を返さない場合に、条件がTRUEと評価されます。
SQL構文
[NOT] EXISTS (Subquery)説明
-
副問合せと
EXISTSを組み合せて指定すると、行の存在についてテストできます。EXISTSは行の空のセットの有無をテストします。副問合せが1行以上の行を返す場合、副問合せはTRUEと評価されます。 -
副問合せと
NOT EXISTSを組み合せて指定すると、行の不在についてテストできます。NOT EXISTSは行の空のセットの有無をテストします。副問合せが行を返さない場合、副問合せはTRUEと評価されます。 -
結合順序が
NOT EXISTS副問合せの結合順序の要件と競合するttOptSetOrder組込みプロシージャを使用して発行される場合、指定された結合順序は無視され、警告が発行されて問合せが実行されます。 -
次の表に、TimesTenでの
EXISTSおよびNOT EXISTSの使用方法について、サポートの有無を示します。問合せ/副問合せの説明 Not Exists Exists 副問合せでの集計
サポート
サポート
メインの問合せでの集計
サポート
サポート
OR句での副問合せサポート
サポート
ttOptSetOrder組込みプロシージャを使用した結合順序制限付きサポート
サポート
例
1件以上の未発送の発注がある顧客を検索します。
SELECT customers.name FROM customers WHERE EXISTS (SELECT 1 FROM orders WHERE customers.id = orders.custid AND orders.status = 'unshipped');
未発送の発注がない顧客を検索します。
SELECT customers.name FROM customers WHERE NOT EXISTS (SELECT 1 FROM orders WHERE customers.id = orders.custid AND orders.status = 'unshipped');
IS INFINITE条件
IS INFINITE条件は、式が無限大(正の無限大(INF)または負の無限大(-INF))であるかどうかを判断します。
SQL構文
Expression IS [NOT] INFINITEパラメータ
| パラメータ | 説明 |
|---|---|
|
|
テストする式。 |
説明
-
IS INFINITE条件は、式が正または負の無限大の場合にTRUEと評価されます。 -
IS NOT INFINITE条件は、式が正および負の無限大ではない場合にTRUEと評価されます。 -
式は、数値データ型、または数値データ型に暗黙的に変換可能なデータ型に解決される必要があります。
-
2つの正の無限大の値は等しくなります。2つの負の無限大の値は等しくなります。
-
浮動小数点値を含む式では、
Inf、-InfまたはNaNが生成される場合があります。これらの値は、式でオーバーフローまたは例外状態が生成された場合、あるいは式内の1つ以上の値がInf、-InfまたはNaNの場合に生成される可能性があります。InfおよびNaNは、オーバーフローまたは0(ゼロ)による除算が条件の場合に生成されます。 -
集計関数では、
Inf、-InfおよびNaNの値は無視されません。NULL値は無視されます。集計(または任意の選択)からInfおよびNaNを除外する場合は、IS NOT NAN条件およびIS NOT INFINITE条件の両方を使用します。 -
負の無限大(
-INF)は、他のすべての値より下位にソートされます。正の無限大(INF)は、他のすべての値より上位、かつNaN(非数)およびNULL値より下位にソートされます。 -
InfおよびNaNの詳細は、「INFおよびNAN」を参照してください。
IS NAN条件
IS NAN条件は、式が演算での未定義の結果(非数またはNaN)であるかどうかを判断します。
SQL構文
Expression IS [NOT] NANパラメータ
| パラメータ | 説明 |
|---|---|
|
|
テストする式。 |
説明
-
IS NAN条件は、式が非数の場合にTRUEと評価されます。 -
IS NOT NAN条件は、式が非数ではない場合にTRUEと評価されます。 -
式は、数値データ型、または数値データ型に暗黙的に変換可能なデータ型に解決される必要があります。
-
2つの
NaN(非数)の値は等しくなります。 -
浮動小数点値を含む式では、
Inf、-InfまたはNaNが生成される場合があります。これらの値は、式でオーバーフローまたは例外状態が生成された場合、あるいは式内の1つ以上の値がInf、-InfまたはNaNの場合に生成される可能性があります。InfおよびNaNは、オーバーフローまたは0(ゼロ)による除算が条件の場合に生成されます。 -
集計関数では、
Inf、-InfおよびNaNの値は無視されません。NULL値は無視されます。集計(または任意の選択)からInfおよびNaNを除外する場合は、IS NOT NAN条件およびIS NOT INFINITE条件の両方を使用します。 -
NaN(非数)は、正の無限大を含む他のすべての値より上位、かつNULL値より下位にソートされます。 -
InfおよびNaNの詳細は、「INFおよびNAN」を参照してください。
IS NULL条件
IS NULL条件は、式にNULL値が含まれているかどうかを判断します。式がNULLの場合、TRUEと評価されます。NOTオプションを使用すると、式がNOT NULLの場合にTRUEと評価されます。
SQL構文
{ColumnName | Constant | Expression | LOBDataType} IS [NOT] NULLパラメータ
| パラメータ | 説明 |
|---|---|
|
|
値を取得する列の名前。各列名の詳細は、「名前、ネームスペースおよびパラメータ」を参照してください。 |
|
|
特定の値。定数の詳細は、「定数」を参照してください。 |
|
|
テストする式。 |
|
|
テストする |
例
IS NULLを使用して、会社の社長(マネージャを持たない唯一の人物)を識別します。
Command> SELECT * FROM employees
WHERE manager_id IS NULL;
< 100, Steven, King, SKING, 515.123.4567, 1987-06-17 00:00:00, AD_PRES, 24000,
<NULL>, <NULL>, 90 >
1 row found.
次の文ではIS NULLを使用して、州または都道府県を持たない場所をすべて識別しています。
Command> SELECT * FROM locations
WHERE state_province IS NULL;
< 1000, 1297 Via Cola di Rie, 00989, Roma, <NULL>, IT >
< 1100, 93091 Calle della Testa, 10934, Venice, <NULL>, IT >
< 1300, 9450 Kamiya-cho, 6823, Hiroshima, <NULL>, JP >
< 2000, 40-5-12 Laogianggen, 190518, Beijing, <NULL>, CN >
< 2300, 198 Clementi North, 540198, Singapore, <NULL>, SG >
< 2400, 8204 Arthur St, <NULL>, London, <NULL>, UK >
6 rows found.LIKE条件
ソースに特定のパターンが含まれている場合に、LIKE条件はTRUEと評価されます。LIKE条件は、指定されたパターンをソースで検索して、文字値の部分間の突合せを行います。
SQL構文
Source [NOT] LIKE Pattern [ESCAPE {'EscapeChar' | {? | :DynamicParameter} }]
Patternの構文は、次のとおりです。
Expression [ || Expression ] [ ... ]
パラメータ
| パラメータ | 説明 |
|---|---|
|
|
このソースに出現する指定されたパターンがすべて検出されます。ソースには、式、列、関数の結果の文字列またはこれらの任意の組合せを指定することができ、これがパターンの突合せが行われるソースに使用される文字列になります。ソースには、 |
|
|
1つ以上の式により、ソース内で検索する文字パターンを示します。パターンのデータ型は、 複数の式を連結して、パターンに使用する文字列を生成できます。 パターンは文字(数字と特殊文字を含む)で構成されます。たとえば、 次の1つ以上の記号を使用して、部分一致をテストする条件を使用することもできます。
|
|
|
パターン内に含まれる式には、列、動的パラメータまたは文字列に評価される関数の結果を使用できます。式の詳細は、「式の指定」を参照してください。 |
|
|
パターン内の エスケープ文字は単一の文字である必要があります。エスケープ文字をパターンに使用する場合は、その後に続けてエスケープ文字自体、 |
|
?
|
準備されたSQL文の動的パラメータです。パラメータの値は、文の実行時に設定されます。 |
説明
-
エスケープ文字が指定されている場合を除き、パターン内の
_または%記号はワイルド・カード文字として機能します。エスケープ文字を指定した場合、それに後続するワイルド・カードまたはエスケープ文字はリテラルとして扱われます。エスケープ文字に後続する文字がワイルド・カードまたはエスケープ文字ではない場合、エラーになります。 -
式、列、文字列、動的パラメータまたは関数の結果を組み合せてパターンを指定する場合、||演算子を使用してアイテムを連結し、最終的なパターンを指定できます。
-
LIKE条件を使用する文字式を比較するすべての条件において、大/小文字は区別されます。 -
式の値、パターン、エスケープ文字が
NULLの場合、LIKE条件はNULLと評価されます。 -
LIKE条件がマルチバイト文字セットで使用される場合、処理に時間がかかることがあります。 -
NCHAR、NVARCHARまたはNCLOBに含まれる各国語キャラクタ文字列内での検索の詳細は、「NCHAR、NVARCHAR2およびNCLOBデータ型の文字列のパターン一致」を参照してください。
例
姓が'Sm'で始まる従業員を検索します。
Command> SELECT employee_id, last_name,first_name FROM employees
WHERE last_name LIKE 'Sm%'
ORDER BY employee_id,last_name,first_name;
< 159, Smith, Lindsey >
< 171, Smith, William >
2 rows found.
姓が'SM'で始まる従業員を検索します。last_nameが大文字の'SM'で始まる従業員がいないため、この問合せでは結果は返されません。
Command> SELECT employee_id, last_name,first_name from employees
WHERE last_name LIKE 'SM%'
ORDER BY employee_id,last_name,first_name;
0 rows found.
ただし、姓列のソース値を大文字に変換することによって、'SM'で始まるすべての名前を検出できます。
Command> SELECT employee_id, last_name, first_name FROM employees
WHERE UPPER(last_name) LIKE ('SM%');
< 159, Smith, Lindsey >
< 171, Smith, William >
2 rows found.
?で示される動的パラメータを使用して、姓が'Sm'で始まる従業員を実行時に検索します。
Command> SELECT employee_id, last_name,first_name FROM employees
WHERE last_name like ?
ORDER BY employee_id,last_name,first_name;
Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.
Enter Parameter 1 '_QMARK_1' (VARCHAR2) > 'Sm%'
< 159, Smith, Lindsey >
< 171, Smith, William >
2 rows found.
:aで示されるバインド変数を使用して、姓が'Sm'で始まる従業員を実行時に検索します。
Command> SELECT employee_id, last_name,first_name FROM employees
WHERE last_name LIKE :a
ORDER BY employee_id,last_name,first_name;
Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.
Enter Parameter 1 'A' (VARCHAR2) > 'Sm%'
< 159, Smith, Lindsey >
< 171, Smith, William >
2 rows found.
姓が'Smit'で始まる従業員について、そのマネージャの姓を検索します。従業員の名前と姓、およびマネージャの姓を表示します。
Command> SELECT e1.first_name || ' ' || e1.last_name||' works for '||e2.last_name
FROM employees e1, employees e2
WHERE e1.manager_id = e2.employee_id
AND e1.last_name like 'Smit';
< Lindsey Smith works for Partners >
< William Smith works for Cambrault >
2 rows found.
この問合せパターンでは、検索対象のパターンとして、last_name列を参照します。
Command> SELECT e1.first_name || ' ' || e1.last_name||' works for ' ||
e2.last_name
FROM employees e1, employees e2
WHERE e1.manager_id = e2.employee_id AND 'Smith' like e1.last_name;
< Lindsey Smith works for Partners >
< William Smith works for Cambrault >
2 rows found.
パターンには、列または関数の結果を指定できます。次の例では、UPPER関数を、ソースのlast_name列と検索対象の'ma'検索文字列の両方で使用します。
Command> SELECT last_name, first_name FROM employees
WHERE UPPER(last_name) LIKE UPPER('ma%');
< Markle, Steven >
< Marlow, James >
< Mallin, Jason >
< Matos, Randall >
< Marvins, Mattea >
< Mavris, Susan >
6 rows found.
次の問合せは、動的パラメータを使用したパターンのリクエストを示します。
Command> SELECT first_name || ' ' || last_name
FROM employees WHERE last_name like ?;
Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.
Enter Parameter 1 '_QMARK_1' (VARCHAR2) > 'W%'
< Matthew Weiss >
< Alana Walsh >
< Jennifer Whalen >
3 rows found.
次の問合せでは、パターンで文字列と動的パラメータを組み合せています。
Command> SELECT first_name || ' ' || last_name
FROM employees WHERE last_name like 'W' || ?;
Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.
Enter Parameter 1 '_QMARK_1' (VARCHAR2) > '%'
< Matthew Weiss >
< Alana Walsh >
< Jennifer Whalen >
3 rows found.NCHAR、NVARCHAR2およびNCLOBデータ型の文字列のパターン一致
LIKE条件は、NCHAR、NVARCHAR2およびNCLOB型の文字列のパターン一致に使用できます。パターン一致文字は、次のとおりです。
| 文字 | 説明 |
|---|---|
|
|
単一のUnicode文字を表します。 |
|
|
0(ゼロ)文字以上のUnicode文字列を表します。 |
説明
-
エスケープ文字は、単一のUnicode文字またはパラメータと同様にサポートされます。
-
LIKEオペランドの型は、すべてのキャラクタ・タイプの組合せになります。 -
LIKE条件では、大/小文字およびアクセントを区別しないNLS_SORTがサポートされています。
例
これらの例では、Unicode文字U+0021 EXCLAMATION MARKは、Unicode文字U+005F SPACING UNDERSCOREのエスケープとして使用されています。Unicode文字U+0025 PERCENT SIGNはエスケープされず、パターン一致としてみなされます。
VendorNameは、NCHARまたはNVARCHAR2の列です。
SELECT VendorName FROM Purchasing.Vendors WHERE VendorName LIKE N'ACME!_%' ESCAPE N'!';
この例は次の例と同等です。
SELECT VendorName FROM Purchasing.Vendors WHERE VendorName LIKE N'ACME!\u005F\u0025' ESCAPE N'!';
