我有一个表性别,其中只有两个条目有“男性”和“男性”。仅有2个条目的“女性”行数。现在我想编写一个替换这两个值的过程,输出应该如下,
i/p o/p
sex sex
------------------------
male female
female male
female male
male female
我正在创建一个程序,它给了我一个错误,我使用游标来获取超过1行..我知道我们可以通过仅使用1个更新语句来完成它但我想尝试这样请看看进入这个..
declare
v_gen gender%rowtype;
cursor cur_gender is
select * from gender;
begin
open cur_gender;
loop
fetch cur_gender into v_gen;
select * from gender;
if v_gen='male'
then
update gender set sex='female';
else
update gender set sex='male';
end if;
exit when v_gen%notfound;
end loop;
close cur_gender;
end;
答案 0 :(得分:11)
update Table1 set "col" = (case "col" when 'male' then 'female'
else 'male' end);
的 fiddle 强> 的
答案 1 :(得分:3)
你有什么问题。 PLS-00324的直接原因是v_gen
是一条记录,因此您需要将具有该记录的字段与固定值进行比较,而不是整个记录:
if v_gen='male'
变为
if v_gen.sex = 'male'
然后你有一个假的select * from gender
看起来像是一个意外,需要完全删除。
最后,您将%notfound
应用于记录而不是光标:
exit when v_gen%notfound;
变为
exit when cur_gender%notfound;
嗯,不是最后,因为正如其他人已经注意到你的每个更新语句都在更新表格中的所有行,所以你最终会得到male
或female
所有内容,具体取决于它最后处理的行。您需要标识要更新的特定行。一种方法是将rowid
作为光标的一部分进行查询,但有一种更简单的内置方式:
declare
cursor cur_gender is
select * from gender
for update;
begin
for v_gen in cur_gender
loop
if v_gen.sex='male'
then
update gender set sex = 'female'
where current of cur_gender;
else
update gender set sex = 'male'
where current of cur_gender;
end if;
end loop;
end;
/
或者您可以使用case
代替if
来简化它:
declare
cursor cur_gender is
select * from gender
for update;
begin
for v_gen in cur_gender
loop
update gender
set sex = case v_gen.sex when 'male' then 'female' else 'male' end
where current of cur_gender;
end loop;
end;
/
...这与您已经了解的单一更新语句方法非常接近。该版本SQL Fiddle。
您可以详细了解for update
和where current of
in the documentation。
答案 2 :(得分:3)
id username email gender
1 sanjay sanjay@gmail.com Male
2 nikky nikky@gmail.com Male
11 raj raj@gmail.com Female
12 Rahul rahul@gmail.com Female
update users set gender = (case when gender = 'Male' then 'Female' else 'Male' end);
答案 3 :(得分:1)
在你的情况下,我建议使用Record而不是FETCH:
CREATE OR REPLACE PROCEDURE swap ()
IS
CURSOR cur_gender IS
SELECT * FROM gender;
rec_gender cur_gender%ROWTYPE;
BEGIN
FOR rec_gender IN cur_gender
LOOP
IF cur_gender%FOUND THEN
IF rec_gender.sex = 'male' THEN
UPDATE gender set sex='female'
WHERE idgender = rec_gender.idgender;
ELSE
UPDATE gender set sex = 'male'
WHERE idgender = rec_gender.idgender;
END IF;
-- COMMIT; --MAYBE?
END IF;
END LOOP;
END swap;
/
答案 4 :(得分:1)
执行此操作的sql查询
UPDATE table SET gender =
(CASE WHEN gender ='male' THEN 'female' else 'male' END)
答案 5 :(得分:1)
请使用此查询将男性更新为女性,将女性更新为男性。 参考图片。
语法
UPDATE <TABLE_NAME> set <COL_NAME> = (CASE <COL_NAME> WHEN '<DATA>' THEN'<DATA>' ELSE '<DATA>' END);
示例:
UPDATE users SET gender = (CASE gender WHEN 'Male' THEN 'Female' ELSE'Male' END);
答案 6 :(得分:0)
CREATE OR REPLACE PROCEDURE swap ()
IS
CURSOR cur_gender IS
SELECT * FROM gender;
BEGIN
FOR rec_gender IN cur_gender
LOOP
IF rec_gender.sex = 'male' THEN
UPDATE gender set sex='female' where sex='male';
ELSE
UPDATE gender set sex = 'male' where sex='female';
END IF;
END LOOP;
END swap;
答案 7 :(得分:0)
甚至有一种简单的方法可以做到这一点。您可以使用DECODE在oracle数据库中执行此操作。
更新GENDER SET SEX = DECODE(SEX,&#39; MALE&#39;&#39; FEMALE&#39;,&#39; FEMALE&#39;男,&#39;); < / p>
以上查询改变了男性对女性和女性对男性的性别。希望这会有所帮助..
答案 8 :(得分:0)
简单创建一个表让它成为人
创建表人(性别varchar2(10));
插入人物价值('&amp; gender'); 假设i / ps是男性,女性,女性,男性
从人群中选择*; 性别 男 女 女 男 选择解码(性别,'男性','女性','女性','男性')性别的人; 性别 女 男 男 女
答案 9 :(得分:0)
/ 逻辑 /
SELECT Name,CASE 当性别='男性'然后'女性' ELSE'Male' 结束 AS“NewGender” 来自NameGender;
/ 这里NameGender是表的名称 /
答案 10 :(得分:0)
update Employee
set Gender= case Gender when 'Male' then 'Female' when 'Female' then 'Male'
else
Gender
end
答案 11 :(得分:0)
以下查询在AWS redshift中效果很好
update Table1 set gender =
(
select case when gender = 'male' then 'female'
when gender = 'female' then 'male' end
)
答案 12 :(得分:0)
Dim dbValue = EntityObject.Entry(obj).GetDatabaseValues()
If dbValue IsNot Nothing Then
exist
End If