我想知道是否有办法在
WHERE
子句中使用用户定义的变量,如本例所示:
SELECT id, location, @id := 10 FROM songs WHERE id = @id
此查询运行时没有错误,但未按预期工作。
与 Mike E. 的提议相去不远,但有一个声明:
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一样,我需要一些用户定义的变量来提高可读性并减少一些大型查询中的操作。 我最终得到了如下查询,这些查询只是为了演示目的而创建的。 我首先定义变量,然后在 WHERE 子句中的一个漂亮的
IF()
语句中分配它们,因为它是在 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`
);
id | 绳子 | “cd”的位置 | “德”的位置 |
---|---|---|---|
1 | abcde | 3 | 4 |
2 | bcdef | 2 | 3 |
3 | cdefg | 1 | 2 |
4 | defgh | 0 | 1 |
5 | efghi | 0 | 0 |
第二个 SELECT 查询
现在还可以使用 WHERE 中的变量来过滤行
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`
)
AND @CDpos = (@DEpos - 1) -- always true if both strings are present
AND @CDpos > 0;
id | 绳子 | “cd”的位置 | “德”的位置 |
---|---|---|---|
1 | abcde | 3 | 4 |
2 | bcdef | 2 | 3 |
3 | cdefg | 1 | 2 |