我正在尝试做一些基本上像这样的事情。
伪代码
DECLARE @logic BIT = 1
SELECT user_name,
user_id,
if @logic = 1
(
(SELECT first_name + ' ' + last_name FROM users y
WHERE x.user_id = y.user_id) AS 'Full name',
)
birth_dte FROM x
意图是如果设置了一个位,它将向select查询添加其他结果。我相信这对于动态SQL是可行的,但如果存在另一种解决方案,我想避免这种情况。
在 CASE @logic WHEN 1那么...... 方法在这里不起作用,因为当@logic!= 1时,它将返回一个没有名称的空列。我希望它根本不能返回那个列,只需使用下一个。
有没有办法做到这一点?谢谢!
编辑:我可以“如果@logic然后选择... ELSE select ...”但我的用例最终将使用多个不同的逻辑位检查。
如果我需要与@ logic_1,@ logic_2,@ logic_3,@ logic_4,@ logic_5进行比较,我最终会有很多重复,我想避免。我认为这可能无法集成到选择字段中,但我认为其他人可能有一些我不知道的技巧。
答案 0 :(得分:0)
如果我理解你的问题,你想要这样的事情:
DECLARE @logic BIT = 1;
IF @logic = 1
BEGIN
SELECT user_name
, user_id
, first_name+' '+last_name AS 'Full name'
, birth_dte
FROM x
INNER JOIN users y ON x.user_id = y.user_id;
END;
ELSE
BEGIN
SELECT user_name
, user_id
, birth_dte
FROM x
INNER JOIN users y ON x.user_id = y.user_id;
END;
答案 1 :(得分:0)
您可以执行以下操作
DECLARE @logic BIT = 1
IF @logic = 1
BEGIN
SELECT user_name,
user_id,
(SELECT first_name + ' ' + last_name FROM users y
WHERE x.user_id = y.user_id) AS 'Full name',
)
birth_dte
FROM x
END
ELSE
BEGIN
SELECT user_name,
user_id,
birth_dte
FROM x
END
答案 2 :(得分:0)
DECLARE @logic BIT = 1
,@Sql NVARCHAR(MAX);
SET @Sql = N' SELECT [user_name]
, [user_id] '
+ CASE WHEN @logic = 1 THEN
N' , first_name + '' '' + last_name AS Name ' ELSE N' ' END
+ N' FROM [users] '
Exec sp_executesql @Sql