0

私は Oracle APEX で、2016 年に予定されている生徒の誕生日のリストを作成し、それらを時系列で並べ替えるクエリを作成していました。これは機能し、次のコードを使用しました。

SELECT first_name, last_name, to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy') AS birthday
FROM students
WHERE date_of_birth IS NOT NULL
ORDER BY birthday

これにより正しい出力が得られ、2016 年の時系列の誕生日で名前が表示されるようになりました。

しかし、今度は生徒がクラスで誕生日を祝う日を示す別の列を取得したいと考えました。したがって、誕生日が平日の生徒の場合は同じ日になりますが、誕生日が週末の生徒の場合は月曜になります。case ステートメントを使用して、'saturday' または 'sunday' を 'monday' に変更します。

学生の誕生日が祝われる日を示すクエリを既に作成しました。これにより、「金曜日」や「水曜日」などの適切な出力が得られます。コードは次のとおりです。

SELECT first_name, last_name, to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy') AS birthday, to_char(to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy'), 'day') AS celebrationday
FROM students
WHERE date_of_birth IS NOT NULL
ORDER BY birthday

次のように、最初の名前が「ジョン」の場合に何かを追加するなど、ケースステートメントを使用していくつかの簡単なテストを既に実行しました。

SELECT student_number, first_name,
(CASE first_name
WHEN 'John' THEN 'Check'
END) addition
FROM Students

その結果、正しい出力が得られました。「John」以外のすべての名前の場合、列の追加は null になり、その名前を持つ名前の列の追加には「Check」が含まれます。

さて、主な問題は、Celebrationday が週末にあるかどうかを確認するためにこれを複製しようとすると次のエラーが発生すること から始まります。

SELECT first_name, last_name, to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy') AS birthday, to_char(to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy'), 'day') AS celebrationday,
(CASE celebrationday
WHEN 'saturday' THEN 'monday'
WHEN 'sunday' THEN 'monday'
END) addition
FROM students
WHERE date_of_birth IS NOT NULL
ORDER BY birthday

(少し解説します。ケースには他の曜日も含める必要があることはわかっていますが、最初は週末の日から適切な出力を得ることに興味があります)

または、次のコードでは、列の追加で結果が得られず、null 値のみが得られます。

SELECT first_name, last_name, to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy') AS birthday,
CASE to_char(to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy'), 'day)
WHEN 'saturday' THEN 'monday'
WHEN 'sunday' THEN 'monday'
END) addition
FROM Students
WHERE date_of_birth IS NOT NULL
ORDER BY date_of_birth
  • お祝いの日を変更できるようにケースステートメントを機能させるには、どうすればよいですか? 提供されているコード例が十分に明確であり、何が機能していて何が機能していないかを理解できることを願っています。
4

3 に答える 3

0

ああ... to_char を使用して日を返しています。クエリの末尾のスペースを考慮する必要があります。値は基本的に char(9) として入力されます。

結果をトリミングし、他の日を考慮して ELSE 条件を追加すれば、問題ないと思います..

    CASE trim(to_char(to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy'), 'day'))
    WHEN 'saturday' THEN 'monday'
    WHEN 'sunday' THEN 'monday'
    else trim(to_char(to_date(concat(to_char(date_of_birth, 'dd-mm'), '-2016'), 'dd-mm-yyyy'), 'day'))
    END addition
于 2015-10-16T23:20:15.117 に答える