使用CASE的MSSQL到MYSQL,然后是SUBSTRING& CHARINDEX

时间:2012-02-01 12:35:18

标签: mysql sql-server substring case concat

我在转换下面的MSSQL语句时遇到了一些实际困难,无法在MYSQL中生成相同的结果。

MSSQL查询如下:

SELECT Radius_AdslUser.Password, Radius_AdslIp.IpAdd, Route = 
CASE WHEN Radius_AdslIP.Route IS NULL 
THEN NULL 
WHEN Radius_AdslIp.TotalIp = 8 
THEN Radius_AdslIP.Ipadd + '/29 ' + SUBSTRING(Radius_AdslIp.Route, 10, Charindex(' ', Radius_AdslIp.Route) - 10) + ' 1' 
WHEN Radius_AdslIp.TotalIp = 4
THEN Radius_AdslIP.Ipadd + '/30 ' + SUBSTRING(Radius_AdslIp.Route, 10, Charindex(' ', Radius_AdslIp.Route) - 10) + ' 1' 
WHEN Radius_AdslIp.TotalIp = 16
THEN Radius_AdslIP.Ipadd + '/28 ' + SUBSTRING(Radius_AdslIp.Route, 10, Charindex(' ', Radius_AdslIp.Route) - 10) + ' 1'
END, AVPair = 
CASE WHEN Radius_AdslUser.bandcap IS NULL 
THEN NULL 
ELSE 'throttle=' + Radius_AdslUser.bandcap 
END, Radius_AdslIp.Subnet
FROM Radius_AdslUser,Radius_AdslIp
WHERE Username = 'username@test.tld'
AND Suspended = 0
AND Radius_AdslUser.IpAddId = Radius_AdslIp.IpAddId

产生以下结果:

Password    IpAdd           Route                               AVPair  Subnet
kmbjdatr    10.0.0.1        10.0.0.1/29 10.0.0.0 1              NULL    255.255.255.255

表的格式如下:

Radius_AdslIp

IpAddId IpAdd           Subnet          TotalIp UsableIp    Route                                   TypeId
944     10.0.0.1        255.255.255.255 8       6           ip:route=10.0.0.0 255.255.255.248       4

Radius_AdslUser

Username                    Password    IpAddId
username@test.tld           kmbjdatr    944

我已将CHARINDEX替换为LOCATE,并使用了CONCAT,但运气不佳。

例如:

WHEN Radius_AdslIp.TotalIp = 8 THEN Radius_AdslIp.Ipadd = CONCAT(Radius_AdslIp.Ipadd, '/29 ')

MYSQL中的表格格式相同。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

好像你没有正确应用CONCAT功能。基本上,SQL Server表达式如下:

column_name + 'constant string' + function_call() + @variable

在MySQL中看起来像这样:

CONCAT(column_name, 'constant string', function_call(), @variable)

摘录中的特定错误部分似乎是Radius_AdslIp.Ipadd =CONCAT之前的那个)。不确定你的意思,但无论如何它都不需要那里。