mysql случай когда в статьях - PullRequest
0 голосов
/ 06 мая 2020

Мне нужно проверить значение @inv_status с приведенным ниже кодом MySQL, но не получить желаемый результат. Я ожидаю «успех 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"; 

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Ваш код эквивалентен этому:

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', потому что логическое выражение @ip_AllocationId = 1 AND @ip_status IS NULL 1-й ветви CASE выражение - 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 в списке значений, разделенных запятыми, вместо прямого сравнения. См. Демонстрацию .

0 голосов
/ 06 мая 2020

Оператор IN -сравнения ожидает, что параметр будет набором, а не строкой. В ваших значениях он возвращает набор, но эту постоянную одиночную строку '1,4', которая не совпадает с 1.

...