14

どこかで見たことがあると思いますが、適切な用語が見つからないので困っています...

ユーザー情報を含むテーブルがあるとします (また、それは私よりも多くの報酬を受け取る誰かによって作成されたものであると仮定しましょう。そのため、スキーマを変更することはできません)。ユーザー情報のさまざまな列の中には、生年月日と役職の列があります。 . これらの列の内容に基づいて、「Real_Title」という追加の列を含むクエリが必要です。たとえば、次のようになります。

User_id    Job_Title    DOB
  joe_1      manager    01/01/1950
  jim_1    associate    01/01/1970
 jill_1    associate    01/01/1985
 jane_1      manager    01/01/1975

クエリ:

SELECT User_id, Real_Title FROM users
IF (YEAR(DOB) < 1980 AND Job_Title = "manager")
   {Real_Title = "Old Fart"}
ELSE IF (YEAR(DOB) < 1980 AND Job_Title = "associate")
   {Real_Title = "Old Timer"}
ELSE IF (YEAR(DOB) > 1980 AND Job_Title = "manager")
   {Real_Title = "Eager Beaver"}
ELSE IF (YEAR(DOB) > 1980 AND Job_Title = "associate")
   {Real_Title = "Slacker"}

上記が間違っているだけでなく、コーディングが非常に非効率的であることはわかっていますが、アイデアを伝えたかったのです。

結合を使用せずに、同じテーブル内の 1 つ以上の他の列の情報に基づいて列を作成する方法はありますか?

現在、結果が得られた後にPHPスクリプトで何かを使用して、それらの結果を必要なグループに導きますが、クエリで実行できる場合は、クエリを他のスクリプトや言語に移植するのがはるかに簡単になります.

ありがとう!

4

2 に答える 2

30
select User_id
,case 
    when (YEAR(DOB) < 1980 AND Job_Title = "manager")   then 'Old Fart'
    when (YEAR(DOB) < 1980 AND Job_Title = "associate") then 'Old Timer'
    when (YEAR(DOB) > 1980 AND Job_Title = "manager")   then 'Eager Beaver'
    when (YEAR(DOB) > 1980 AND Job_Title = "associate") then 'Slacker'
    else 'nobody'
end
as Real_Title 
from users
于 2009-05-11T18:29:02.833 に答える
13

私の理解が正しければ、 CASE ステートメントを探していると思います。

SELECT User_id,
        (CASE
            WHEN YEAR(DOB) < 1980 AND Job_Title = "manager" THEN "Old Fart"
            WHEN YEAR(DOB) < 1980 AND Job_Title = "associate" THEN "Old Timer"
            ...
            ELSE "Unknown Title"
        END) AS Real_Title
FROM users;
于 2009-05-11T18:25:05.460 に答える