无法一致地设置变量

时间:2018-02-03 14:14:14

标签: mysql variables set case

我无法一致地设置和查询变量@imgpath 从它获得价值后,我发现它不一致 在left(SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1),1) in("C")

时 例如,concat返回" 0"根据这一节 来自SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1)的已解析数据 看起来像这样:

C5
C178

在我的脚本中,我查询@image路径,如

If(substring(@imgpath,1,1) = "C",dosmthing,dosomthing)

很多时候这将返回" 0"

我认为这是我设置@imgpath

的方式或地点

如果我没有使用THEN将其分配给变量,它可以正常工作(正确)

select pa.name,
case
  when left(SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1),1) in("B") then  @imgpath :=
    if(SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1) < "B16",3464,101)
  when left(SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1),1) in("C") then @imgpath :=
     if(length(SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1)) < 3,
       concat(left(SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1),1), "0", 
              right(SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1),1)),SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1))
  when left(SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1),1) = "J" then @imgpath :=
    if(SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1) < "J19",3464,101)
  when left(SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1),1) = "O" then @imgpath := 101
  when SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1) < 116 then @imgpath := 3464
  when SUBSTRING_INDEX(SUBSTRING_INDEX(pa.name, ' ', 2), ' ', -1) >= 116 then @imgpath := 101
 end as "temp",

1 个答案:

答案 0 :(得分:0)

你无法做你想做的事。 MySQL documentation 显式表明:

  

在下面的语句中,您可能会认为MySQL会进行评估   首先是@a,然后是第二个任务:

mysql> SET @a='test';
mysql> SELECT @a,(@a:=20) FROM tbl_name;
     

但是,涉及用户变量的表达式的评估顺序是未定义的。

换句话说,您不能指望在不同的表达式中使用该变量。