4

請求書のテーブルから取得するやや複雑な SQL クエリがあります。クエリ対象のテーブルは、3 つの数値フィールドを使用して日付を作成します (日、月、および年用に 1 つ)。

このクエリは、TO_DATE 関数内で concat 関数呼び出しを組み合わせて使用​​します。クエリの SELECT 部分では問題はありませんが、WHERE 句で同じステートメントを使用すると、最初のステートメントを参照する "ORA-01858: 数値が期待されていた場所に数値以外の文字が見つかりました" というメッセージが表示されます。 WHERE 句の TO_DATE 内での concat の使用。

では、where 句で concat と TO_DATE を使用することの違いは何でしょうか?

たとえば、WHERE の次の部分は、数字以外の文字エラーを引き起こします。

to_date(
  concat(invoice_year,
  concat('-',
  concat(invoice_month, 
  concat('-',invoice_day)))),'YYYY-MM-DD')
  > add_months(sysdate,-6)

しかし、selectのこのステートメントは問題なく評価されます

to_date(
  concat(invoice_year,
  concat('-',
  concat(invoice_month,
  concat('-',invoice_day)))),'YYYY-MM-DD') as invoice_date
4

1 に答える 1

7

TO_DATE 式が評価されるときにエラーを引き起こす行がテーブルにある可能性があります。しかし、それは WHERE 句の他の条件を満たしていません。

式を SELECT リストに入れると、行が WHERE 句のすべての条件を通過するまで評価されません。

条件で式を使用すると、他の条件の前に評価される可能性があるため、エラーが発生した行に対して評価される可能性があります。

特定の行のこれらのフィールドのいずれかに NULL があると、エラーが発生することに注意してください。

于 2011-03-03T02:24:52.253 に答える