在 'and' 附近预期条件的上下文中指定的非布尔类型的表达式。在 SQL CASE 服务器中

An expression of non-boolean type specified in a context where a condition is expected, near 'and'. In SQL Server at CASE

SELECT 
    d.district_id, d.district_name, d1.district_id, d1.district_name
FROM 
    tbl_district d, tbl_district d1 
WHERE
     CASE
        WHEN (d.district_id % 2) != 0 
           THEN d.district_id 
     END
     AND d1.district_id = d.district_id+1;

"Case when"是一个值,不是逻辑运算。

例如:

 SELECT 
d.district_id, d.district_name, d1.district_id, d1.district_name
FROM 
tbl_district d, tbl_district d1 
WHERE
 CASE
    WHEN (d.district_id % 2) != 0 
       THEN d.district_id 
 END+1 = d1.district_id  

我猜你是想过滤奇数

SELECT 
    d.district_id, d.district_name, d1.district_id, d1.district_name
FROM 
    tbl_district d 
INNER JOIN tbl_district d1 
        ON d1.district_id = d.district_id+1
WHERE (d.district_id % 2) != 0 

也开始使用 INNER JOIN 而不是旧式的逗号分隔连接

如果您正在使用 SQL SERVER 2012+ 那么您可以使用 LEAD window 函数

SELECT *
FROM   (SELECT *,
               Lead(district_id)OVER(ORDER BY district_id) AS next_dst,
               Lead(district_name)OVER(ORDER BY district_id) AS next_name
        FROM   tbl_district ) a
WHERE  a.district_id + 1 = a.next_dst
       AND ( district_id % 2 ) != 0 
CREATE PROCEDURE [dbo].[EvenOdd_District]
AS
BEGIN

      SELECT d.district_id ,d.district_name,d1.district_id ,d1.district_name
      FROM tbl_district d,tbl_district d1 WHERE d.district_id=
         CASE
            when (d.district_id%2)!=0 then d.district_id 
         END
         AND d1.district_id=d.district_id+1;
END