Пользовательская переменная MySQL в предложении WHERE

Я хочу знать, есть ли способ использовать пользовательскую переменную в WHERE предложение, как в этом примере:

SELECT id, location, @id := 10 FROM songs WHERE id = @id

Этот запрос выполняется без ошибок, но не работает должным образом.

5 ответов

Решение

Недалеко от того, что предложил Майк Э., но одно утверждение:

SELECT id, location FROM songs, ( SELECT @id := 10 ) AS var WHERE id = @id;

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

На странице справки MySQL по пользовательским переменным:

Как правило, вы никогда не должны присваивать значение пользовательской переменной и читать значение в том же выражении. Вы можете получить ожидаемые результаты, но это не гарантировано.

Поэтому вы должны отделить присвоение от оператора select:

SET @id = 10;
SELECT id, location, @id FROM songs WHERE id = @id;

Конечно, но я никогда не видел, чтобы кто-то пытался установить переменную и использовать ее в том же выражении, что и вы. Пытаться:

SET @id := 10;
SELECT @id := 10 FROM songs WHERE id = @id;

или же

SELECT @id := 10 FROM songs;
SELECT @id := 10 FROM songs WHERE id = @id;

Я использовал оба, и они оба, кажется, работают на меня.

Это сработало для меня!

SET @identifier = 7;
SELECT * FROM test where identifier = @identifier;

Ну а что насчет этого.

Как и @PauloFreitas, мне понадобились некоторые пользовательские переменные, чтобы улучшить читаемость и сократить количество операций в некоторых больших запросах. В итоге у меня получились запросы, подобные приведенным ниже, созданные только для демонстрационных целей. Сначала я определяю переменные, а затем изящно присваиваю их.IF()в предложении WHERE, поскольку он выполняется перед частью SELECT, но основан на данных строки. Тогда я смогу использовать их где угодно.

      CREATE TABLE `strings` (
  `id` INT UNSIGNED,
  `string` VARCHAR(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

    INSERT INTO `strings` (`id`, `string`) VALUES
(1, "abcde"),
(2, "bcdef"),
(3, "cdefg"),
(4, "defgh"),
(5, "efghi");

-- Declare the variables:
SET @CDpos=-1;
SET @DEpos=-1;

Первый запрос SELECT

Показать использование заполнения переменных данными строки

      SELECT
    `id`, 
    `string`,
    @CDpos AS `Position of "cd"`,
    @DEpos AS `Position of "de"`
FROM 
    `strings` 
WHERE 
    `id` = IF(
                (((@CDpos:=LOCATE("cd", `string`)) OR TRUE) 
                AND ((@DEpos:=LOCATE("de", `string`)) OR TRUE))
                , `id`
                , `id`
            );

Просмотр на DB Fiddle

Другие вопросы по тегам