将列值从“男性”替换为“女性”,将“女性”替换为“男性”

时间:2013-07-31 11:20:42

标签: sql oracle plsql oracle10g

我有一个表性别,其中只有两个条目有“男性”和“男性”。仅有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; 

13 个答案:

答案 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;

嗯,不是最后,因为正如其他人已经注意到你的每个更新语句都在更新表格中的所有行,所以你最终会得到malefemale所有内容,具体取决于它最后处理的行。您需要标识要更新的特定行。一种方法是将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 Fiddle

或者您可以使用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 updatewhere 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)

请使用此查询将男性更新为女性,将女性更新为男性。 参考图片。

Table data before

语法

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

Table data after

答案 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