2

我只是有一个奇怪的问题。我知道这可能很有趣,但我只是对此感到好奇。这是我的详细问题:

假设数据库中有一个名为“性别”的列,它具有布尔值,即 0 或 1。0=男性,1=女性。现在,当我们显示具有这种类型字段的表单的数据时,我们必须编写代码,即(gender=0)?Male:Female.

现在我只想知道sql是否提供任何方式,在生成记录集时自动将所有性别值自动替换为男性或女性。即不需要这一行代码?

4

5 回答 5

5

我会使用decode

select decode(gender,0,'Male','Female') from your_table;
于 2012-12-31T17:14:54.550 回答
5

除了其他人展示的 case/decode 之外,在 11gR1 及以后的版本中,我们可以拥有一个虚拟列。

SQL> create table test(name varchar2(20), gender number(1));

Table created.

SQL> insert into test values ('Paul', 0);

1 row created.

SQL> insert into test values ('Vicky', 1);

1 row created.

SQL> commit;

Commit complete.

SQL> alter table test add (gender_str varchar2(6) generated always as (case gender when 0 then 'Male' when 1 then 'Female' end));

Table altered.

SQL> select * from test;

NAME                                         GENDER GENDER
-------------------- ------------------------------ ------
Paul                                              0 Male
Vicky                                             1 Female

如果您愿意,您也可以索引虚拟列。

于 2012-12-31T17:21:40.593 回答
4

您可以为此使用case语句,如下所示:

select
 case gender when 0 then 'Male' when 1 then 'Female' end
from
 ...

如果性别既不是 0 也不是 1,您将在该列中得到一个空值。

于 2012-12-31T17:14:07.893 回答
2

您还可以考虑将此逻辑编码到一个虚拟列中,就像他们在 Oracle 中调用它们一样。SQL Server 人员会将它们称为计算列。

这种方法的优点是现有逻辑将继续写入您的性别字段(因此无需重写),但新应用程序可以从该genderEnglishName字段中提取。

The "right" answer in my mind is to obey the standard for sex, ISO 5218. I would retain the gender field as an integer, assign the correct translations and leave the interpretation logic up to the presentation layer in case you ever need to work with internationalization.

于 2012-12-31T17:23:40.113 回答
1

您可以CASE WHEN用来评估自己的价值观:)

Case when column = true 
then myvalue 
else true End

查看您的确切查询值:而且我相信只有 0 和 1,因此您只需要一个When:))

-- your code
Case when Gender = 0 
Then 'Male'
Else 'Female'
End 
-- rest of your code
于 2012-12-31T17:13:37.980 回答