【问题标题】:How do I alias particular values in SQL?如何在 SQL 中为特定值设置别名?
【发布时间】:2017-03-21 19:18:25
【问题描述】:

我将提出一个关于从列中“别名化”值的问题。我将使用一周中的几天作为一个直观的示例来解决我的问题,但我要求进行日期时间转换。

假设我有以下 SQL 脚本:

SELECT DaysOfWeek 
FROM [databasename].[dbo].[tablename]

现在,DaysOfWeek 列将返回日期名称的字符串值,即“星期一”、“星期二”等等。

如果我希望查询返回整数 1 代表“星期一”,返回整数 2 代表“星期二”,等等?我想在SELECT 语句中为每周的每一天分配一个特定的值,但我不确定如何去做。

我对 SQL 比较陌生,所以我只是想我会要求一种直观的方法来执行这样的任务。

编辑添加:我只是使用星期几和它们各自的整数表示作为一个简单的例子;我的任务不涉及星期几,而是员工代码编号和相应的职位。

【问题讨论】:

  • 正常的方法是首先存储整数值。您的表中真的只有一个字符串吗?你能解决这个问题吗?
  • DaysOfWeek 是表中的列还是存储函数?它不能是变量。
  • 请看我的编辑-谢谢。 @Anand,我的意思是说“列”。我现在就改一下。
  • 听起来您需要阅读有关查找表和规范化的信息。查找表是大多数关系数据库的生命线,理解它们对于系统的成功至关重要。它们与 select 语句一样基本和常见。
  • @GarrettVlieger 不,不是。

标签: sql sql-server database


【解决方案1】:

您可以使用case

SELECT (CASE DaysOfWeek 
             WHEN 'Monday' THEN 1
             WHEN 'Tuesday' THEN 2
             . . .
        END)

在大多数情况下,没有必要像这样存储星期几。您可以轻松地使用函数datepart()datename() 从日期/时间值中提取星期几。

如果列在表中,而不是日期的一部分,那么您可能希望将上述逻辑包含为计算列:

alter table t add DayOfWeekNumber as (case DaysOfWeek when 'Monday' then 1 . . .);

【讨论】:

  • case 是我正在寻找的有效术语。我了解使用参考表的好处,但出于求知欲,我想知道如何在脚本中使用 sn-p 代码来完成同样的事情。谢谢!
【解决方案2】:

使用 CASE,here 你有定义和一个例子:

select
    CASE 
          WHEN(DaysOfWeek="Monday") THEN 1
          WHEN(DaysOfWeek="Thusday") THEN 2
          ....
    ELSE  -1 
from table

希望对您有所帮助!

【讨论】:

    【解决方案3】:

    如果您想为另一个值定义自己的对应值,最好的方法是使用一个表,然后加入该表。

    例如:

    create table dbo.EmployeeTitle (
        id int not null identity(1,1) primary key
      , title varchar(32)
      );
    
    create table dbo.Employee (
        id int not null identity(1,1) primary key
      , name nvarchar(128)
      , title_id int references dbo.EmployeeTitle(id)
      );
    
    insert into dbo.EmployeeTitle values ('Big boss');
    insert into dbo.Employee values ('daOnlyBG',1);
    
    select e.*, et.title
    from dbo.Employee e
      inner join dbo.EmployeeTitle et
        on e.title_id = et.id
    

    rextester 演示:http://rextester.com/FXIM78632

    返回:

    +----+----------+----------+----------+
    | id |   name   | title_id |  title   |
    +----+----------+----------+----------+
    |  1 | daOnlyBG |        1 | Big boss |
    +----+----------+----------+----------+
    

    【讨论】:

      【解决方案4】:

      我能想到的最简单的方法是有一个表变量或 CTE;将您的查找创建为行并加入它。像这样的:

      with cte as (
        select 1 as emp_code, 'value1' as emp_title
        union
        select 2 as emp_code, 'value2' as emp_title
        union
        select 3 as emp_code, 'value3' as emp_title
      )
      
      select cte.emp_code, tableName.*
      from tableName
      inner join cte
      on cte.emp_title = tableName.some_column
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多