【问题标题】:If-Else Statement in T-SQLT-SQL 中的 If-Else 语句
【发布时间】:2010-08-17 21:47:24
【问题描述】:

我正在尝试更改当前显示的 Transact-SQL (MS SQL Server) 报告的结果:

CompanyA     DVCE3
CompanyB     DVCE2
CompanyC     DVCE3
CompanyD     NULL 
CompanyE     DVCE3

我希望它改为显示:

CompanyA     36
CompanyB     24
CompanyC     36
CompanyD      
CompanyE     36

我确定这个问题的答案是使用某种 if/else 语句或 case 语句,但我不确定 T-SQL 中的语法或它在我的查询中的位置。

我的基本查询如下所示:

SELECT
   companyName
   , term
FROM tableA a
   JOIN tableB b on a.id = b.id ...
WHERE 
   customerNumber IS NOT NULL
   AND companyName != 'TEST'... ;

感谢您的帮助。

【问题讨论】:

  • 值 36 和 24 是否来自特定列(可能在另一个表中?),还是应该将它们硬编码到 SQL 中?
  • 它们应该是硬编码的 - 24 和 36 不是从另一列中取出的,好问题。这只是一个更易读的结果(DVCE3 代表 3 年期限,或 36 个月)。

标签: sql sql-server tsql syntax


【解决方案1】:

将您的“术语”字段替换为以下内容:

CASE WHEN term='DVCE3' THEN '36' WHEN term='DVCE2' THEN '24' ELSE '' END as term

为了可读性我会重写它:

CASE
    WHEN term='DVCE3' THEN '36'
    WHEN term='DVCE2' THEN '24'
    ELSE ''
END as term

【讨论】:

  • 非常感谢,这行得通。唯一轻微的副作用是,由于某种原因,无论原件返回 NULL,您的结果都返回数字 0。
  • @dvanaria - SQL 在转换为数字时出于某种奇怪的原因将 '' 转换为 0。将所有数字放在单引号中,例如'36' 所以它将该列视为字符串。
  • 这给了我我正在寻找的确切输出(通过将 24 和 36 放在引号中)。感谢您的帮助!
【解决方案2】:

如果您只有几个替代品,您可以将它们粘贴在case 声明中,如下所示。

SELECT
   companyName
   ,CASE term WHEN  'DVCE3' THEN '36' WHEN 'DVCE2' THEN '24' ELSE '' END AS term
FROM tableA a
   JOIN tableB b on a.id = b.id ...
WHERE 
   customerNumber IS NOT NULL
   AND companyName != 'TEST'... ;

如果您有更多,或者您将在其他查询中重复此逻辑,您可以设置一个映射表(永久表、视图或内联 TVF),然后您可以加入该表。

【讨论】:

  • 小细节:您还需要处理将NULL转换为''的情况。
【解决方案3】:

Case 语句将起作用。但是,更好的答案可能是将数据放入表中并进行连接,或者只是将其放入公司表中的字段中。从长远来看,这使它更具可扩展性。

CREATE TABLE CompanyTerms (
    id INT,
    CompanyName NVARCHAR(100) NOT NULL, 
    Term NVARCHAR(100) NULL
)

...

SELECT
   companyName
   , c.Term
FROM tableA a
   JOIN tableB b on a.id = b.id ...
   JOIN CompanyTerm c ON c.id = a.id
WHERE 
   customerNumber IS NOT NULL
   AND companyName != 'TEST'... ;

【讨论】:

  • 这听起来是个不错的建议,但就本报告的范围而言,我不必太担心可扩展性,至少不必担心结果中该列中可能包含哪些值。
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 2019-04-09
  • 1970-01-01
相关资源
最近更新 更多