Пользовательская переменная 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`
);