使用 IF-ELIF-ELSE 条件计算 SQL 中的列
Calculated column in SQL with IF-ELIF-ELSE condition
我需要有关如何在 SQL 代码中计算此计算列的帮助。我之前在论坛上看到过如何根据将列加在一起或仅给出标准值来进行计算。但就我而言,我想添加一个列,该列可以根据另一列的值显示不同的预设值。它就像一个普通的 IF-ELIF-ELSE 语句。
在我的例子中,我有一个数据库,一个 table,它记录了用户在系统中所做的每一次更改。每当进行更改时,用户的员工编号都会记录到 table 而不是员工的姓名。由于我们花费大量时间返回这些日志,因此我们花费大量时间查找哪个雇主编号属于谁。我希望这可以直接在查询中完成。我有所有员工编号及其对应名称的列表。
我的基本SQL技能只告诉我如何导入table/columns和创建一个,但是对于IF语句我完全迷路了,下面我执行了一些伪代码所以你可能明白我在找什么。 A.Emp_Num 是包含员工编号的列,Emp_Name 是创建的列,内容是 'null'。
SELECT A.EMP_NUM, A.COLUMN1, A.COLUMN2, 'Null' AS EMP_NAME
FROM LOGGINGTABLE A
IF A.EMP_NUM=='1234' THEN EMP_NAME='MONICA'
ELIF A.EMP_NUM=='5678' THEN EMP_NAME='JOE'
天啊,你有员工 table 吗?快加入吧
SELECT A.EMP_NUM, A.COLUMN1, A.COLUMN2, E.EMP_NAME
FROM LOGGINGTABLE A
INNER JOIN EMPLOYEETABLE E on A.EMP_NUM = E.EMP_NUM
编辑: 如果您有未映射到用户的条目并且您不想错过它们
SELECT A.EMP_NUM, A.COLUMN1, A.COLUMN2, isnull(E.EMP_NAME,'No User Linked') as EMP_NAME
FROM LOGGINGTABLE A
LEFT OUTER JOIN EMPLOYEETABLE E on A.EMP_NUM = E.EMP_NUM
编辑: 如果您想在 table
中获取有文本记录的员工
BULK INSERT dbo.temp
FROM 'c:\temp\file.txt'
WITH
(
ROWTERMINATOR ='\n'
)
然后
Insert into EMPLOYEETABLE
select LEFT(column1, CHARINDEX(' ', column1+ ' ') - 1),
RIGHT(column1, len(column1)-CHARINDEX(' ', column1+ ' ') - 1)
from dbo.temp
你可能需要修改它,让我知道这样做有什么困难。
试试下面的方法
注意:维护EMP_NAME和EMP_NUM之间的关系,以后会有用。
如果员工人数更多,那么我们不能像下面这样对值进行硬编码,因此要保持它们之间的关系
SELECT CAST(
CASE
WHEN EMP_NUM =1234
THEN 'MONICA'
WHEN EMP_NUM =5678
then 'JOE'
.
.
.
END AS nvarchar(1000)) as EMPNAME,EMP_NUM, COLUMN1, COLUMN2
FROM LOGGINGTABLE
或
SELECT
CASE
WHEN EMP_NUM =1234
THEN 'MONICA'
WHEN EMP_NUM =5678
then 'JOE'
.
.
.
END as EMPNAME,EMP_NUM, COLUMN1, COLUMN2
FROM LOGGINGTABL
建议:我建议您在 table 中添加一个名为 EMP_NAME 的新列,然后将这些值保存在该列中,并在将来插入 EMP_NUM 时插入EMP_NAME 太容易维护了
我需要有关如何在 SQL 代码中计算此计算列的帮助。我之前在论坛上看到过如何根据将列加在一起或仅给出标准值来进行计算。但就我而言,我想添加一个列,该列可以根据另一列的值显示不同的预设值。它就像一个普通的 IF-ELIF-ELSE 语句。
在我的例子中,我有一个数据库,一个 table,它记录了用户在系统中所做的每一次更改。每当进行更改时,用户的员工编号都会记录到 table 而不是员工的姓名。由于我们花费大量时间返回这些日志,因此我们花费大量时间查找哪个雇主编号属于谁。我希望这可以直接在查询中完成。我有所有员工编号及其对应名称的列表。
我的基本SQL技能只告诉我如何导入table/columns和创建一个,但是对于IF语句我完全迷路了,下面我执行了一些伪代码所以你可能明白我在找什么。 A.Emp_Num 是包含员工编号的列,Emp_Name 是创建的列,内容是 'null'。
SELECT A.EMP_NUM, A.COLUMN1, A.COLUMN2, 'Null' AS EMP_NAME
FROM LOGGINGTABLE A
IF A.EMP_NUM=='1234' THEN EMP_NAME='MONICA'
ELIF A.EMP_NUM=='5678' THEN EMP_NAME='JOE'
天啊,你有员工 table 吗?快加入吧
SELECT A.EMP_NUM, A.COLUMN1, A.COLUMN2, E.EMP_NAME
FROM LOGGINGTABLE A
INNER JOIN EMPLOYEETABLE E on A.EMP_NUM = E.EMP_NUM
编辑: 如果您有未映射到用户的条目并且您不想错过它们
SELECT A.EMP_NUM, A.COLUMN1, A.COLUMN2, isnull(E.EMP_NAME,'No User Linked') as EMP_NAME
FROM LOGGINGTABLE A
LEFT OUTER JOIN EMPLOYEETABLE E on A.EMP_NUM = E.EMP_NUM
编辑: 如果您想在 table
中获取有文本记录的员工BULK INSERT dbo.temp
FROM 'c:\temp\file.txt'
WITH
(
ROWTERMINATOR ='\n'
)
然后
Insert into EMPLOYEETABLE
select LEFT(column1, CHARINDEX(' ', column1+ ' ') - 1),
RIGHT(column1, len(column1)-CHARINDEX(' ', column1+ ' ') - 1)
from dbo.temp
你可能需要修改它,让我知道这样做有什么困难。
试试下面的方法
注意:维护EMP_NAME和EMP_NUM之间的关系,以后会有用。 如果员工人数更多,那么我们不能像下面这样对值进行硬编码,因此要保持它们之间的关系
SELECT CAST(
CASE
WHEN EMP_NUM =1234
THEN 'MONICA'
WHEN EMP_NUM =5678
then 'JOE'
.
.
.
END AS nvarchar(1000)) as EMPNAME,EMP_NUM, COLUMN1, COLUMN2
FROM LOGGINGTABLE
或
SELECT
CASE
WHEN EMP_NUM =1234
THEN 'MONICA'
WHEN EMP_NUM =5678
then 'JOE'
.
.
.
END as EMPNAME,EMP_NUM, COLUMN1, COLUMN2
FROM LOGGINGTABL
建议:我建议您在 table 中添加一个名为 EMP_NAME 的新列,然后将这些值保存在该列中,并在将来插入 EMP_NUM 时插入EMP_NAME 太容易维护了