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 NULL
是 TRUE
.
所以结果是 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.
我必须使用下面的 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 NULL
是 TRUE
.
所以结果是 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.