MySQL WHERE 子句中的用户定义变量

问题描述 投票:0回答:5

我想知道是否有办法在

WHERE
子句中使用用户定义的变量,如本例所示:

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

此查询运行时没有错误,但未按预期工作。

mysql where-clause
5个回答
31
投票

与 Mike E. 的提议相去不远,但有一个声明:

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

我使用类似的查询来模拟 MySQL 中的窗口函数。例如。 行采样 - 只是在同一语句中使用变量的示例


14
投票

来自 MySQL 手册页的 用户定义变量

作为一般规则,您永远不应该在同一语句中为用户变量赋值并读取该值。您可能会得到预期的结果,但这并不能保证。

所以你应该将赋值与 select 语句分开:

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

5
投票

当然,但我从未见过有人像您一样尝试设置变量并在同一个语句中使用它。尝试:

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

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

我都用过,它们似乎都适合我。


2
投票

这对我有用!

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

0
投票

嗯,这个怎么样?

就像@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

在 DB Fiddle 上查看

© www.soinside.com 2019 - 2024. All rights reserved.