5

我有一张表,gender,其中只有两个条目,“男性”和“女性”的行数只有这两个条目。现在我想编写一个替换这两个值的程序,输出应该如下所示,

Input           Output

sex             sex
------------------------
male            female
female          male
female          male
male            female

我正在创建一个程序,这给了我一个错误。我正在使用游标来获取多行。我知道我们可以只使用一个更新语句来做到这一点,但我想尝试这样。

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;
4

13 回答 13

19
update Table1 set "col" = (case "col" when 'male' then 'female'
else 'male' end);

小提琴

于 2013-07-31T11:31:12.017 回答
4
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);
于 2016-02-02T04:38:38.173 回答
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; 
/

SQL 小提琴

或者您可以通过使用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

于 2013-07-31T14:03:27.943 回答
3
UPDATE table 
SET    gender = CASE gender 
                  WHEN 'Male' THEN 'Female' 
                  WHEN 'Female' THEN 'Male' 
                  ELSE gender 
                END; 
于 2019-12-26T04:45:45.907 回答
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;
/
于 2013-07-31T11:37:23.137 回答
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);

表数据后

于 2021-03-15T17:25:59.907 回答
1

执行此操作的 SQL 查询:

UPDATE table SET gender =
(CASE  WHEN  gender ='male' THEN 'female' else 'male' END)
于 2020-02-12T04:51:10.603 回答
1

甚至有一种简单的方法可以做到这一点。您可以使用DECODE在 Oracle 数据库中执行此操作。

UPDATE GENDER SET SEX = DECODE(SEX, 'MALE', 'FEMALE', 'FEMALE', 'MALE');

上面的查询将男性的性别更改为女性,将女性的性别更改为男性。

于 2016-04-05T17:58:06.123 回答
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;
于 2013-07-31T11:51:59.120 回答
0
/*Logic*/

SELECT Name, CASE
  WHEN Gender = 'Male' THEN 'Female'
  ELSE 'Male'
  END
AS "NewGender"
FROM NameGender ;

/*Here NameGender is the name of the Table*/
于 2016-06-04T06:11:43.847 回答
0

简单地创建一个表,让它成为

create table people(gender varchar2(10));

insert into people values('&gender');

假设输入是男性,女性,女性,男性:

select * from people;
GENDER
    male
    female
    female
    male

select decode(gender, 'male', 'female', 'female', 'male') sex from people;
SEX
    female
    male
    male
    female
于 2016-05-09T07:26:05.833 回答
0
update Employee
set Gender= case Gender when 'Male' then 'Female' when 'Female' then 'Male'
else 
Gender
end
于 2018-05-16T06:45:34.123 回答
0

以下查询在Amazon Redshift中运行良好。

update Table1 set gender = 
(
    select case when gender = 'male' then 'female'
                when gender = 'female' then 'male' end
)
于 2019-06-17T11:58:39.057 回答