2017-08-17 80 views
2

我遇到了LIKE语句附近的sql查询错误。我是否在CASE的WHEN子句中错误地格式化了LIKE子句?这是代码。无法精确定位LIKE关键字附近的错误

SELECT 
substring (Cases.FileNumber,4,6) AS [FileNumber] 
,Charge.ChargeCode 
,Cases.BookedLastName 
,Cases.BookedFirstName 
,Cases.ArrestDate 
,Cases.BookedDOB 
,Cases.BookedAge 
,Charge.OffenseToDate 
,Cases.BookedRace 
,Cases.BookedSex 
,Charge.OffenseStreetAddress1 
,Charge.OffenseCity 
,Charge.OffenseState 
,Charge.OffenseZipCode 
,Charge.ChargeDescription 
,(SELECT CASE 
WHEN charge1.ChargeDescription LIKE N'%heroin%' THEN 'Heroin' 
     ELSE 'Not Heroin' 
     END 
    FROM tblCsCharge AS charge1 
      INNER JOIN tblCsCases AS cases1 
          ON charge1.FileNumber = cases1.FileNumber 
WHERE 
     charge1.BookedLastName = cases1.BookedLastName 
     AND charge1.BookedLastName = cases1.BookedLastName 
     AND charge1.BookedDOB = Cases.BookedDOB 
     AND cases2.ChargeCode IN (N'579.015-001Y201735')) AS HeroinYN 
FROM 
    tblCsCases AS Cases 
    INNER JOIN tblCsCharge AS Charge 
     ON Cases.FileNumber = Charge.FileNumber 
    WHERE Cases.IssuedDate >= 01/01/2017 
    AND 
    Cases.IssuedDate <= @EndDate 
    AND 
    Charge.ChargeCode IN (N'579.015-001Y201735') 
    AND 
    Cases.BookedLastName NOT IN (N'Bogus') 

    ORDER By 
    Cases.BookedLastName 

这是一家专注于构建只会输出海洛因或不基于海洛因关闭在我们的数据库中的大量文本字段的一列一个更大的查询中的子查询。

编辑:

尽管变化,应该使代码编译,下面的错误现在出现: 无效的列名称BookedLastName“。 列名'BookedLastName'无效。 列名'BookedDOB'无效。 无法绑定多部分标识符“cases2.ChargeCode”。

+1

看起来你错过了AS ASINYN之前的一个关系,并且混合了搜索到的CASE形式。 –

+0

“不喜欢代码”,以及你的意思是什么? –

+0

你不能合并'CASE'的两个变体,要么你做'CASE表达'当值THEN ...'或者当'表达那么'的时候,你就是合并。 –

回答

0

为正确的语法是:

CASE 
    WHEN charge1.ChargeDescription LIKE N'%heroin%' THEN 'Heroin' 
    ELSE 'Not Heroin' 
END 

不要在此语法把字段名CASE后。

1

这似乎是这个问题..

AND cases2.ChargeCode IN (N'579.015-001Y201735') AS HeroinYN

由于这是一个子查询的一部分,你需要另一个parenthese

AND cases2.ChargeCode IN (N'579.015-001Y201735')) AS HeroinYN

ALSO

您不能将列名称放在之后当您使用相等运算符时,声明为。

这是可以接受的

select 
    case columnName 
     when 'X' then 1 
     when 'Y' then 0 
    end 

这不是

select 
    case columnName 
     when = 'X' then 1 
     when columnName like '%Y%' then 0 
    end 

修正后的脚本

,(SELECT CASE 
     WHEN charge1.ChargeDescription LIKE N'%heroin%' THEN 'Heroin' 
     ELSE 'Not Heroin' 
     END 
    FROM tblCsCharge AS charge1 
      INNER JOIN tblCsCases AS cases1 
          ON charge1.FileNumber = cases1.FileNumber 
WHERE 
     charge1.BookedLastName = cases1.BookedLastName 
     AND charge1.BookedLastName = cases1.BookedLastName 
     AND charge1.BookedDOB = Cases.BookedDOB 
     AND cases2.ChargeCode IN (N'579.015-001Y201735')) AS HeroinYN 
2

你在你的代码中有两处错误,而这两者都是指出,尽管不是在相同的答案。

  1. 你的case语句应该没有括号中的列名 - 我评论它在下面的代码)
  2. 你错过了在查询的最后一个右括号的副本,前右别名 - 我在下面添加它。

,(SELECT CASE--(charge1.ChargeDescription) 
     WHEN charge1.ChargeDescription LIKE N'%heroin%' THEN 'Heroin' 
     ELSE 'Not Heroin' 
     END 
    FROM tblCsCharge AS charge1 
      INNER JOIN tblCsCases AS cases1 
          ON charge1.FileNumber = cases1.FileNumber 
WHERE 
     charge1.BookedLastName = cases1.BookedLastName 
     AND charge1.BookedLastName = cases1.BookedLastName 
     AND charge1.BookedDOB = Cases.BookedDOB 
     AND cases2.ChargeCode IN (N'579.015-001Y201735')) AS HeroinYN 
+0

从CASE之后删除列名称会产生错误,指出BookedLastName,BookeDOB和ChargeCode是无效的列名称。我已经三重检查过这些实际上是正确的列名,包括大写字母。它们在不使用CASE的不同文件中的另一个子查询中起作用。 我相信我们的数据库是SQL Server。 CASE查询只能与T-SQL一起使用还是应该与SQL服务器一起使用? – JackOfTales

+0

此查询将正确解析 - 问题可能在于您尚未发布的更大查询中(这似乎只是其中的一部分) – Eli

+0

TSQL是SQL Server的SQL语言@JackOfTales的实现。发布你的整个查询,因为Eli和我的答案都会避免基于你发布的错误(尽管ELI需要在他的答案中加上圆括号) – scsimon

相关问题