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を探していますその他の理由。
OracleではIF()
を使用するはずだった場所でDECODE()
を使用できます。
mysql> select if(emp_id=1,'X','Y') as test, emp_id from emps;
[〜#〜] case [〜#〜] ステートメントを使用できます。ただし、0〜150の整数のテーブルと、年齢を書かれて、あなたはそれに参加することができます
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
OracleのDECODE
のように見える別のMySQLオプションは、FIELD
とELT
の組み合わせです。次のコードでは、FIELD()
はAgeに一致する文字列の引数リストの位置を返します。 ELT()
は、FIELD()
で指定された位置にあるELT
s引数リストから文字列を返します。たとえば、Age
が14
である場合、2
はFIELD
の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
を返します。
例は次のように直接変換されます。
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
次のようにmySqlのdecode()の代わりにif()を使用できます。このクエリはすべてのid行を出力します。
mysql> select id, name from employee where id in
-> (select if(id%2=0,id,null) from employee);
追加のテーブルが収まらない場合は、翻訳用の独自の関数を作成できます。
大文字小文字を区別するsql関数の利点は、さまざまな場所で使用でき、翻訳ロジックを1か所に保持できることです。