18

我在将 MS Access 查询转换为 SQL 时遇到了一些问题:

SELECT id, col1, col2, col3
FROM table1

LEFT OUTER JOIN table2
ON table1.id = table2.id

LEFT OUTER JOIN table3
ON table1.id = table3.id

到目前为止一切顺利,但这是我卡住的(CASE)部分:

CASE WHEN table3.col3 IS NULL THEN table2.col3 AS col4 ELSE table3.col3 as col4

我知道上面的行不起作用,但希望它暗示了我想要完成的事情。谢谢!

更新:到目前为止,所有建议都导致“关键字'AS'附近的语法不正确”错误,所以也许我还缺少其他东西。在实际查询下方。问题是我们有两个表,都有 EUID 列。如果 dbo.EU_Admin3.EUID 不为 NULL,则在连接中优先。如果 dbo.EU_Admin3.EUID 为 NULL,请改用 dbo.EU_Admin2.EUID。希望澄清这一点。

SELECT dbo.AdminID.CountryID, dbo.AdminID.CountryName, dbo.AdminID.RegionID, 
dbo.AdminID.[Region name], dbo.AdminID.DistrictID, dbo.AdminID.DistrictName,
dbo.AdminID.ADMIN3_ID, dbo.AdminID.ADMIN3 
(CASE WHEN dbo.EU_Admin3.EUID IS NULL THEN dbo.EU_Admin2.EUID ELSE dbo.EU_Admin3.EUID END AS EUID)
FROM dbo.AdminID 

LEFT OUTER JOIN dbo.EU_Admin2
ON dbo.AdminID.DistrictID = dbo.EU_Admin2.DistrictID

LEFT OUTER JOIN dbo.EU_Admin3
ON dbo.AdminID.ADMIN3_ID = dbo.EU_Admin3.ADMIN3_ID
4

4 回答 4

38

尝试这个:

CASE WHEN table3.col3 IS NULL THEN table2.col3 ELSE table3.col3 END as col4

as col4应该在 CASE 语句的末尾。另请注意,您也错过了END

另一个可能更简单的选择是:

IIf([table3.col3] Is Null,[table2.col3],[table3.col3])

澄清一下,MS Access 不支持 COALESCE。如果是这样,那将是最好的方法。

在根本问题更改后进行编辑:

要将查询转换为 SQL Server,您可以使用 COALESCE (因此之前在技术上也得到了回答):

SELECT dbo.AdminID.CountryID, dbo.AdminID.CountryName, dbo.AdminID.RegionID, 
dbo.AdminID.[Region name], dbo.AdminID.DistrictID, dbo.AdminID.DistrictName,
dbo.AdminID.ADMIN3_ID, dbo.AdminID.ADMIN3,
COALESCE(dbo.EU_Admin3.EUID, dbo.EU_Admin2.EUID)
FROM dbo.AdminID

顺便说一句,您的 CASE 语句,在该字段之前缺少一个。这就是为什么它不起作用。

于 2013-09-10T14:05:34.347 回答
2

无法理解您的实际问题,但您的案例陈述不正确

CASE 
WHEN 
TABLE3.COL3 IS NULL
THEN TABLE2.COL3
ELSE
TABLE3.COL3
END 
AS
COL4
于 2013-09-10T14:11:13.840 回答
2

看起来它可能属于 select 语句:

SELECT id, col1, col2, col3, (CASE WHEN table3.col3 IS NULL THEN table2.col3 AS col4 ELSE table3.col3 as col4 END)
FROM table1
LEFT OUTER JOIN table2
ON table1.id = table2.id
LEFT OUTER JOIN table3
ON table1.id = table3.id
于 2013-09-10T14:04:43.630 回答
1

感谢你的帮助!@Svetoslav Tsolov 非常接近,但我仍然遇到错误,直到我发现右括号在错误的位置。这是有效的最终查询:

SELECT dbo.AdminID.CountryID, dbo.AdminID.CountryName, dbo.AdminID.RegionID, 
dbo.AdminID.[Region name], dbo.AdminID.DistrictID, dbo.AdminID.DistrictName,
dbo.AdminID.ADMIN3_ID, dbo.AdminID.ADMIN3,
(CASE WHEN dbo.EU_Admin3.EUID IS NULL THEN dbo.EU_Admin2.EUID ELSE dbo.EU_Admin3.EUID END) AS EUID
FROM dbo.AdminID 

LEFT OUTER JOIN dbo.EU_Admin2
ON dbo.AdminID.DistrictID = dbo.EU_Admin2.DistrictID

LEFT OUTER JOIN dbo.EU_Admin3
ON dbo.AdminID.ADMIN3_ID = dbo.EU_Admin3.ADMIN3_ID
于 2013-09-10T14:55:37.130 回答