mysql case when in 从句

mysql case when in clauses

我必须使用下面的 MySQL 代码检查 @inv_status 的值,但没有得到所需的输出。 我期待 "success 1" 但它给了 0,请建议。

SET @ip_AllocationId = 1;
SET @ip_status = NULL;

SET @inv_status = 4;


SELECT  CASE WHEN @inv_status IN(
SELECT
CASE 
  WHEN @ip_AllocationId = 1 AND ISNULL(@ip_status) THEN (SELECT CONCAT("1",",","4"))
  WHEN @ip_AllocationId = 1 AND @ip_status=1 THEN 1
  WHEN @ip_AllocationId = 1 AND @ip_status=2 THEN 4
  ELSE NULL
 END AS filter
) THEN "1" ELSE "0" END AS "success"; 

IN-比较运算符要求参数是一个集合,而不是一个字符串。在您的值中,它 returns 是一个集合,但该集合常量单个字符串 '1,4' 与 1 不同。

您的代码等同于:

SET @ip_AllocationId = 1;
SET @ip_status = NULL;
SET @inv_status = 4;

SELECT @inv_status = (
  CASE 
    WHEN @ip_AllocationId = 1 AND @ip_status IS NULL THEN CONCAT('1',',','4')
    WHEN @ip_AllocationId = 1 AND @ip_status=1 THEN 1
    WHEN @ip_AllocationId = 1 AND @ip_status=2 THEN 4
  END
) AS success;

您正在做的是将 @inv_status 与字符串 '1,4' 进行比较,因为 CASE 表达式的第一个分支的布尔表达式 @ip_AllocationId = 1 AND @ip_status IS NULLTRUE.
所以结果是 FALSE 你得到 0.
我怀疑你想要的是这样的:

SET @ip_AllocationId = 1;
SET @ip_status = NULL;
SET @inv_status = 4;

SELECT FIND_IN_SET(@inv_status,
  CASE 
    WHEN @ip_AllocationId = 1 AND @ip_status IS NULL THEN CONCAT('1',',','4')
    WHEN @ip_AllocationId = 1 AND @ip_status=1 THEN '1'
    WHEN @ip_AllocationId = 1 AND @ip_status=2 THEN '4'
  END
) > 0 AS success;

这样您就可以在逗号分隔的值列表中检查 @inv_status 是否存在,而不是直接比较。
demo.