如果满足逻辑,则仅添加到select语句

时间:2017-01-25 18:14:17

标签: sql sql-server

我正在尝试做一些基本上像这样的事情。

伪代码

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进行比较,我最终会有很多重复,我想避免。我认为这可能无法集成到选择字段中,但我认为其他人可能有一些我不知道的技巧。

3 个答案:

答案 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