我有一个包含两个字段(ID,性别)的人员表。我的大多数性别值是“ M”或“ F”,但是有一些“ N”和一些空值。修复这些错误值不是一种选择,但是我仍然需要在查询中解决它们。我试图将“ N”和空值随机分配给“ M”或“ F”。我在下面的查询似乎应该可以正常工作,但是它给了我一个 ORA-01722:无效数字错误。我还尝试将WHEN行的两边都包装在to_char中,但得到相同的错误。 dbms_random函数是否必须使用数字?
我可以执行一个子查询,将它们分配给1或2,然后执行外部查询以将它们转换为M或F,但是如果我只能在一条语句中执行,则不会。
select id,
gender,
case
when nvl(gender, 'N') = 'N' then dbms_random.string('M', 'F')
else gender
end as gender_new
from people;
答案 0 :(得分:1)
Oracle function DBMS_RANDOM.STRING()
无法正常工作。作为参数,它使用格式说明符和代表输出字符串的预期长度的数字(由于出现错误,因为您提供的第二个参数[0]
不是数字)。您无法指定要选择的字符串列表。
要在两个值之间生成随机分布,可以使用F
来生成DBMS_RANDOM.VALUE()
和0
之间的随机十进制值,并以1
表达式解释结果,例如:
CASE
Example :
CASE WHEN DBMS_RANDOM.VALUE() < 0.5 THEN 'M' ELSE 'F' END
| GENDER | | :----- | | M | | M | | F | | M | | M |
答案 1 :(得分:1)
select decode(round(dbms_random.value), 1, 'F', 'M') rnd
from dual
connect by level <= 10;
R
-
F
F
F
F
M
M
F
F
M
F
10 rows selected.