UPDATE `myTable` join (SELECT @tempVariable := -1) a
SET `col2` = @tempVariable := @tempVariable + 1, `col2` = (SELECT
CASE
WHEN MOD(@tempVariable,3) =0 THEN '1 of 3'
WHEN MOD(@tempVariable,3) =1 THEN '2 of 3'
WHEN MOD(@tempVariable,3) =2 THEN '3 of 3'
END
)
UPDATE `myTable`
SET
`id` = IF(
((@trimmed:=TRIM(`code_and_note`)) OR TRUE) AND
((@firstSpace:=LOCATE(' ',@trimmed)) OR TRUE) AND
(@firstPart:=IF(@firstSpace=0, '', SUBSTRING(@trimmed, 1, @firstSpace))),
`id`,
`id`
),
...
6条答案
按热度按时间polkgigr1#
这是可能的:-
设置整数(非增量)
w8f9ii692#
如果你想得到这样的东西:
SET @tempVariable := 0; UPDATE myTable SET col1 = 5, col2 = @tempVariable, @tempVariable := 100;
你可以这样做一个技巧:
ALTER TABLE Proj ADD col3 numeric;
SET @tempVariable := 0; UPDATE myTable SET col1 = 5, col2 = @tempVariable, col3 = @tempVariable := 100;
ALTER TABLE Proj DROP col3;
通过这种方式,您可以在不更改表属性的情况下为变量赋值。它在设置动态值时非常有用。
例如:
@tempVariable := @otherVariable + 100;
vlurs2pr3#
关键是“:=”运算符。MySQL User Variable
也可以在SET以外的语句中为用户变量赋值。在这种情况下,赋值运算符必须是:=和not =,因为后者在非SET语句中被视为比较运算符=:
1使用更新列中的一个
**@tempVariable总是100,col 3总是101。似乎mySQL将使用新分配的值而不是表中的原始值。这与MS SQL不同。**为了更清楚地说明,尝试以下示例,col 3和@tempVariable的值将为1001。
2使用表中的其他列而不是更新列。
@tempVariable和col 3将具有相同的值。它们将是col 4原始值+1。
yyhrrdl84#
我使用select测试了一个类似的查询,它对我很有效,因此我将按如下方式重写您的查询
x759pob25#
对于更复杂的公式,使用结果列作为临时存储区会很方便:
m528fe3b6#
我设法在不使用额外临时列的情况下设置多个变量,方法是在
IF()
中设置它们,其中有多个条件都必须进行评估,并使用这些条件设置一个随机列(例如PK)。例如,我需要在
UPDATE
语句中设置3个变量,以将字符串拆分为2个(结合一些条件):我通过将
id
列设置为自身来实现这一点,并将其 Package 在一个IF()
中,在该IF()
中填充变量:你需要把赋值运算
OR TRUE
在一起,否则如果一个赋值运算结果为FALSE,它们就不会被全部赋值。然后,您可以在后面的列赋值中使用变量:
在这里看到一个工作的DB Fiddle:https://www.db-fiddle.com/f/4UeH69PQdse1hUb9tyeGPc/0