2017-02-16 5 views
0

私は、データセット内の行ごとに乱数を生成し、英数文字に0と1の間のランダムな値をマップするcase文を持ってしようとしている簡略化した例があります。この方法でランダムな文字に近づいているのは、各ステータス文字の確率を設定できるようにするためです。MySQLのパラメータは常にNULL

SELECT 
@row := RAND() as random, 
case @row 
    when (SELECT @row) > .5 then 'A' 
    when (SELECT @row) > .3 then 'D' 
    when (SELECT @row) > .1 then 'C' 
    when (SELECT @row) <= .1 then 'Z' 
    else 'arg' 
end as status 
FROM 
(SELECT @row := RAND()) r 

しかし、これは常に私の行のための 'arg'を返し、私はこの値を見ることを期待しません。

+0

それがないと元のクエリが動作しますなぜ私は私が解決しようとしていた問題の答えを持っているにもかかわらず、私は非常に興味があります。何が起こっているのかを素早く確認することができます。 – Daniel

答えて

0
CASE case_expression 
    WHEN when_expression_1 THEN commands 
    WHEN when_expression_2 THEN commands 
    ... 
    ELSE commands 
END CASE; 

式の値を一意の値のセットと照合する単純なCASE文です。

な範囲など、より複雑なマッチングを行うためには、あなたが検索CASE文を使用します。検索されたCASE文はIF文と同等ですが、その構文ははるかに読みやすくなります。

CASE 
    WHEN when_expression_1 THEN commands 
    WHEN when_expression_2 THEN commands 
    ... 
    ELSE commands 
END CASE; 

あなたがCASE文の後@rowを削除する必要があります比較して範囲式を使用しているので。

+0

私は何かが明らかに欠けていたことを知っていた...ありがとう。 – Daniel

0

私は問題のクエリは、常に「引数」を返している理由はわからないが、私は私が達成しようとしたランダムな文字列を生成するためにはるかに簡単な方法を持っている:

SELECT substring('AAAAACD', ROUND((RAND() * (7-1))+1), 1); 

この意志'AAAAACD'の部分文字列を部分文字列に変換し、元の文字列に多少の文字を配置することで、各文字の流行を制御することができます。

関連する問題