web-dev-qa-db-ja.com

OracleのDECODE関数に相当するMySQL

MySQLでDECODE関数に相当するものを見つけようとしています。それはこのように動作します:

Select Name, DECODE(Age,
       13,'Thirteen',14,'Fourteen',15,'Fifteen',16,'Sixteen',
       17,'Seventeen',18,'Eighteen',19,'Nineteen',
       'Adult') AS AgeBracket
FROM Person

DECODE関数は、列 'Age'の値を13、14、15.と比較し、適切な文字列値 'Thirteen'、 'Fourteen' ..を返します。何も一致しない場合は、デフォルト値の 'Adult'が返されます。

MySQLで機能するアイデアはこの仕事をすることができますか?ありがとう。

明確化:CASEを使用することが望ましい結果を達成する1つの方法であることに同意しますが、パフォーマンスのためにfunctionを探していますその他の理由。

30
Ali

OracleではIF()を使用するはずだった場所でDECODE()を使用できます。

mysql> select if(emp_id=1,'X','Y') as test, emp_id from emps; 
43
Lokesh Kumar

[〜#〜] case [〜#〜] ステートメントを使用できます。ただし、0〜150の整数のテーブルと、年齢を書かれて、あなたはそれに参加することができます

15
SQLMenace
Select Name, 
case 
  when Age = 13 then 'Thirteen'
  when Age = 14 then 'Fourteen'
  when Age = 15 then 'Fifteen'
  when Age = 16 then 'Sixteen'
  when Age = 17 then 'Seventeen'
  when Age = 18 then 'Eighteen'
  when Age = 19 then 'Nineteen'
  else 'Adult'
end as AgeBracket
FROM Person
9
Allen Kenney

OracleのDECODEのように見える別のMySQLオプションは、FIELDELTの組み合わせです。次のコードでは、FIELD()はAgeに一致する文字列の引数リストの位置を返します。 ELT()は、FIELD()で指定された位置にあるELTs引数リストから文字列を返します。たとえば、Age14である場合、2FIELDの2番目の引数であるため、FIELD(Age, ...)14を返します(Age)。次に、ELT(2, ...)ELTの2番目の引数である'Fourteen'を返します(FIELD()引数をカウントしません)。 IFNULLは、AgeBracketに一致するものがリストに見つからない場合、デフォルトのAgeを返します。

Select Name, IFNULL(ELT(FIELD(Age,
       13, 14, 15, 16, 17, 18, 19),'Thirteen','Fourteen','Fifteen','Sixteen',
       'Seventeen','Eighteen','Nineteen'),
       'Adult') AS AgeBracket
FROM Person

パフォーマンスや読みやすさの点で、これが質問に対する最善の解決策ではないと思いますが、MySQLの文字列関数の調査としては興味深いものです。 FIELDの出力では大文字と小文字が区別されないように注意してください。つまり、FIELD('A','A')FIELD('a','A')は両方とも1を返します。

9
Seth Difley

例は次のように直接変換されます。

Select Name, CASE Age
       WHEN 13 then 'Thirteen' WHEN 14 then 'Fourteen' WHEN 15 then 'Fifteen' WHEN 16 then 'Sixteen'
       WHEN 17 then 'Seventeen' WHEN 18 then 'Eighteen' WHEN 19 then 'Nineteen'
       ELSE 'Adult' END AS AgeBracket
FROM Person

フォーマットすることをお勧めします。このような:

Select Name,
       CASE Age
         when 13 then 'Thirteen'
         when 14 then 'Fourteen'
         when 15 then 'Fifteen'
         when 16 then 'Sixteen'
         when 17 then 'Seventeen'
         when 18 then 'Eighteen'
         when 19 then 'Nineteen'
         else         'Adult'
       END AS AgeBracket
FROM Person
3
user6239614

次のようにmySqlのdecode()の代わりにif()を使用できます。このクエリはすべてのid行を出力します。

mysql> select id, name from employee where id in
-> (select if(id%2=0,id,null) from employee);
0
Niteesh Kumar

追加のテーブルが収まらない場合は、翻訳用の独自の関数を作成できます。

大文字小文字を区別するsql関数の利点は、さまざまな場所で使用でき、翻訳ロジックを1か所に保持できることです。

0
Danubian Sailor