你能告诉我这里做错了吗?
CREATE PROC [dbo].[GetUserEULASelection] (@username VARCHAR(150))
AS
BEGIN
DECLARE @result VARCHAR(250);
SELECT @result = a.NAME
FROM licmn_license_users_accounts_c ua
JOIN accounts a ON a.id = ua.licmn_license_users_accountsaccounts_ida
JOIN licmn_license_users lu ON lu.id = licmn_license_users_accountslicmn_license_users_idb
WHERE lu.username = @username;
CASE
WHEN @result IS NOT NULL
THEN SELECT @result AS 'name'
END
CASE
WHEN @result IS NULL
THEN SELECT '0' AS 'name'
END
END
我是T-SQL的新手(我正在将MySQL程序移植到MSSQL中)
问题是case语句导致编译错误。
答案 0 :(得分:2)
您错误地使用CASE有什么问题。您在该上下文中将其与IF混合
所以你应该这样做:
IF @result IS NOT NULL
SELECT @result AS name
ELSE
SELECT '0' AS name
如果您想使用CASE,您应该在查询中执行此操作:
SELECT CASE
WHEN a.NAME IS NULL THEN '0'
ELSE a.NAME
END as Name
FROM licmn_license_users_accounts_c ua
JOIN accounts a ON a.id = ua.licmn_license_users_accountsaccounts_ida
JOIN licmn_license_users lu ON lu.id = licmn_license_users_accountslicmn_license_users_idb
WHERE lu.username = @username;
答案 1 :(得分:2)
case
不是控制流构造。 if
用于控制流程。我建议用case
替换select
:
SELECT coalesce(@result, '0') AS name;
此外,仅对字符串和日期常量使用单引号。您正在使用单引号作为列别名。虽然受到支持,但这通常会导致代码中的其他问题。
编辑:
您可以使用以下命令替换存储过程的整个主体:
SELECT coalesce(max(a.NAME), '0')
FROM licmn_license_users_accounts_c ua JOIN
accounts a
ON a.id = ua.licmn_license_users_accountsaccounts_ida JOIN
licmn_license_users lu
ON lu.id = licmn_license_users_accountslicmn_license_users_idb
WHERE lu.username = @username;
请注意max()
的使用。这可以保证即使没有匹配也会返回一行。
答案 2 :(得分:1)
使用IF条件,CASE表达式仅用于SELECT语句
答案 3 :(得分:1)
在sql中使用Case。您需要在查询之外使用if。
答案 4 :(得分:1)
您的问题(如其他答案中所述)是您不能使用这样的案例陈述,如果更合适。
但是,您可以完全摆脱条件语句以及局部变量:
CREATE PROC [dbo].[GetUserEULASelection] (@username VARCHAR(150))
AS
BEGIN
SELECT COALESCE(a.NAME, '0') AS Name
FROM licmn_license_users_accounts_c ua
JOIN accounts a ON a.id = ua.licmn_license_users_accountsaccounts_ida
JOIN licmn_license_users lu ON lu.id = licmn_license_users_accountslicmn_license_users_idb
WHERE lu.username = @username;
END