我有一个简化的例子,我试图为数据集中的每一行生成一个随机数,并有一个case语句,将0到1之间的随机值映射到一个字母数字字符。我以这种方式接近随机字符的原因是我可以设置每个状态字符的百分比机会。
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
然而,这总是会让人感到厌烦。对于我的行,我永远不会期望看到这个值。
答案 0 :(得分:0)
虽然我不确定为什么问题中的查询总是返回'arg',但我有一种更简单的方法来生成我试图实现的随机字符:
SELECT substring('AAAAACD', ROUND((RAND() * (7-1))+1), 1);
这将从'AAAAACD'中对一个字符进行子串,并在原始字符串中放置更多或更少的字符,我可以控制每个字符的普遍性。
答案 1 :(得分: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;
由于您在比较中使用范围表达式,因此必须在@row
语句后删除CASE
。