Как работает функция IN?

У меня есть следующий сценарий, в котором мне нужно ввести все UBI_ID_UBICACION в текстовое поле, для каждого ввода скрипт распознает, что это местоположение, и добавляет то, что необходимо, чтобы поместить его в функцию IN, плохо то, что это может быть экранировать (пользователем) символ, который не является числом.

Однако, если я использую функцию IN, это дает мне следующую «ошибку»:

SELECT
    STA_INV_ID,
    STA_INV_NOMBRE,
    UBI_ID,
    CONCAT(
        UBI_ID_UBICACION,
        ' ',
        UBI_NOMBRE
    ) AS UBICACION,
    UBI_ID_UBICACION
FROM
    cat_status_inventario
INNER JOIN cat_per_ubicaciones
WHERE
    STA_INV_ID = 1
AND UBI_ID_UBICACION IN ('6333dsds')
AND UBI_ID_UBICACION <> '0'
GROUP BY
    STA_INV_ID,
    STA_INV_NOMBRE,
    UBI_ID

Этот запрос приносит мне следующую запись, которую я НЕ должен делать, так как в IN, которую я ищу «6333dsds», UBI_ID_UBICACION не существует.

-----------------------------------
    UBICACION   |  UBI_ID_UBICACION
-----------------------------------
 6333 BBB-1-6-2 |       6333        

Самое смешное, что если я скажу это следующим образом IN ('dsds6333'), то получится NULL, что идеально, так как UBI_ID_UBICACION не существует в таблице.

-----------------------------------
    UBICACION   |  UBI_ID_UBICACION
-----------------------------------
      NULL      |      NULL

Правильное место было бы просто IN ('6333'), чтобы принести мне запись. [! [введите описание изображения здесь] [3]] [3]

В качестве данных все местоположения являются только числами.

Знаете ли вы, в чем может быть проблема и как вы можете ее решить?

1
задан 18.01.2017, 17:30
0 ответов

Решение моей проблемы состояло в том, чтобы использовать функцию CAST и внутри нее поле UBI_ID_UBICACION 'конвертировать это' в CHAR для того, чтобы во время оценивания, он это взял как цепь и не из-за типа информации, которая у него есть из-за default (INT).

SELECT
    STA_INV_ID,
    STA_INV_NOMBRE,
    UBI_ID,
    CONCAT(
        UBI_ID_UBICACION,
        ' ',
        UBI_NOMBRE
    ) AS UBI_NOMBRE
FROM
    cat_status_inventario
INNER JOIN cat_per_ubicaciones
WHERE
    STA_INV_ID = 1
AND CAST(UBI_ID_UBICACION AS CHAR) IN ('6332xsds')
AND UBI_ID_UBICACION <> '0'
GROUP BY
    STA_INV_ID,
    STA_INV_NOMBRE,
    UBI_ID
0
ответ дан 03.12.2019, 17:38

Привет, В твоем случае проблема состоит в том, что ты стараешься оценивать буквенно-цифровой expreción против числовой одной, конечно же не идет возвращать какого-либо результата. В твоем случае то, что я сделал бы, состоит в том, чтобы создавать функцию similiar в ту, которую ты находил ниже, которая извлекает целые числа выражения:

    DROP FUNCTION IF EXISTS extractNumber;
DELIMITER //
CREATE FUNCTION extractNumber (cadena1 VARCHAR(255)) 
RETURNS INT(11)
DETERMINISTIC
READS SQL DATA
    BEGIN
    DECLARE posicion, resultado, longitud INT(11) DEFAULT 0;
    DECLARE cadena2 VARCHAR(255);
    SET longitud = LENGTH(cadena1);
    SET resultado = CONVERT(cadena1, SIGNED);

    IF resultado = 0 THEN
        IF cadena1 REGEXP('[0-9]') THEN
            SET posicion = 2;
            checkString:WHILE posicion <= longitud DO
                SET cadena2 = SUBSTR(cadena1 FROM posicion);
                IF CONVERT(cadena2, SIGNED) != 0 THEN
                    SET resultado = CONVERT(cadena2, SIGNED);
                    LEAVE checkString;
                END IF;
                SET posicion = posicion + 1;
            END WHILE;
        END IF;
    END IF;
    RETURN resultado;
END //
DELIMITER ;

Непрерывный он изменил бы твой query следующего способа:

SELECT
    STA_INV_ID,
    STA_INV_NOMBRE,
    UBI_ID,
    CONCAT(
        UBI_ID_UBICACION,
        ' ',
        UBI_NOMBRE
    ) AS UBICACION,
    UBI_ID_UBICACION
FROM
    cat_status_inventario
INNER JOIN cat_per_ubicaciones
WHERE
    STA_INV_ID = 1
AND UBI_ID_UBICACION = extractNumber ('6333dsds')
AND UBI_ID_UBICACION <> '0'
GROUP BY
    STA_INV_ID,
    STA_INV_NOMBRE,
    UBI_ID 

Я изменил тебе IN из-за =, так как, если ты оцениваешь единственное выражение, не является рекомендуемым использовать IN, так как ты уменьшаешь эффективность консультации.

Я надеюсь, что мой вклад подает тебя. Я оставляю тебе ссылку, которая возможно, что он тебе полезен. Функции, чтобы извлекать числа, мы видимся!

0
ответ дан 03.12.2019, 17:38