【问题标题】:Case Statement in SQL using LikeSQL 中的 Case 语句使用 Like
【发布时间】:2011-10-08 01:58:11
【问题描述】:

您好,我有一条 SQL 语句

INSERT INTO Foundation.TaxLiability.EmpowerSystemCalendarCode

SELECT SystemTax.SystemTaxID,
       EmpowerCalendarCode.CalendarCodeID
      ,CASE WHEN  EmpowerCalendarCode.CalendarName LIKE '%Monthly%' THEN 3
            WHEN  EmpowerCalendarCode.CalendarName LIKE '%Annual%' THEN 2
            WHEN  EmpowerCalendarCode.CalendarName LIKE '%Quarterly%' THEN 4
       ELSE 0
       END
       FROM Foundation.Common.SystemTax SystemTax, Foundation.TaxLiability.EmpowerCalendarCode EmpowerCalendarCode
WHERE SystemTax.EmpowerTaxCode = EmpowerCalendarCode.LongAgencyCode and SystemTax.EmpowerTaxType = EmpowerCalendarCode.EmpowerTaxType

即使 CalendarName 具有 Quarterly (EOM) 之类的值,我最终仍会得到 0。任何想法和建议!

【问题讨论】:

  • 如果删除第一行(INSERT INTO...)会显示什么?
  • 你怎么知道表中没有 0 的行?我注意到除了 JOIN 标准之外,您实际上没有任何 WHERE 子句(这就是为什么使用显式 INNER JOIN 而不是老式表、表 JOIN 通常更好的原因)。我建议使用 SELECT 标识这些行,并暂时将目标表排除在外。
  • 我同意@ypercube,如果您删除 INSERT INTO 并将重写 SELECT 替换为 SELECT SystemTax.SystemTaxID, EmpowerCalendarCode.CalendarCodeID, EmpowerCalendarCode.CalendarName。您的 CASE 语句看起来没问题,所以您的 WHERE 中一定有一些东西在扔东西。
  • 根据@ypercube,但选择EmpowerCalendarCode.CalendarName只是为了看看你得到了什么(即,也许加入不好,它都是空值等)跨度>
  • 尝试返回 EmpowerCalendar.CalendarCode 列值以及 case 语句,并仅运行查询(不带插入)。这应该确保 CalendarCode 值是您认为的那样。

标签: sql sql-server-2008


【解决方案1】:

首先,我会将您的 SQL 更新为此,以便您在 SELECT 语句上使用 JOIN,而不是将其放在 WHERE 子句中。

INSERT INTO Foundation.TaxLiability.EmpowerSystemCalendarCode

SELECT SystemTax.SystemTaxID,
       EmpowerCalendarCode.CalendarCodeID
      ,CASE WHEN  EmpowerCalendarCode.CalendarName LIKE '%Monthly%' THEN 3
            WHEN  EmpowerCalendarCode.CalendarName LIKE '%Annual%' THEN 2
            WHEN  EmpowerCalendarCode.CalendarName LIKE '%Quarterly%' THEN 4
       ELSE 0
       END
FROM Foundation.Common.SystemTax SystemTax
INNER JOIN Foundation.TaxLiability.EmpowerCalendarCode EmpowerCalendarCode
    ON SystemTax.EmpowerTaxCode = EmpowerCalendarCode.LongAgencyCode 
    AND SystemTax.EmpowerTaxType = EmpowerCalendarCode.EmpowerTaxType

二,如果删除INSERT INTO会怎样?

【讨论】:

  • @bluefeet:一天结束了,我的眼睛很累。我了解您所做的语法更改,但我无法理解它在功能上有何不同。我没看到什么?
  • 我不相信功能更改“修复”了问题。我猜除了语法更改之外,操作还对代码进行了其他更改(或清理了坏数据,或两者兼而有之)。
  • @Aaron Bertrand 同意,我认为它也没有“解决”问题。我只是提供了一种更好的方式来编写查询而不使用 WHERE 子句
【解决方案2】:

你也可以这样做。我认为这会奏效。

select *
from table
where columnName like '%' + case when @varColumn is null then '' else @varColumn end  +  ' %'

【讨论】:

    【解决方案3】:
    1. 尝试使用 ISNULL() 排除任何 null 问题:
    2. 尝试使用 UPPER() 排除任何区分大小写的问题:

      CASE WHEN upper(isnull(EmpowerCalendarCode.CalendarName, 'none')) LIKE '%MONTHLY%' THEN 3...

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2020-01-17
      • 2021-06-23
      • 1970-01-01
      • 2012-01-07
      • 2014-12-05
      • 2011-12-27
      • 1970-01-01
      相关资源
      最近更新 更多