繁体   English   中英

Select 某些列仅在满足条件时

[英]Select certain column only if condition met

我想要一个没有固定列数的 select。 仅当变量@check = 1 时才应选择列OptionalColumn

这就是我所拥有的(语法不好,但也许它解释了我的问题)

SELECT 
    Column1, Column2,
    (IF @Check = 1
       BEGIN OptionalColumn END)
FROM table

只有在@Check = 1 时才拥有它,而在@Check = 0 时不拥有它是至关重要的。它可行吗?

你可以用这样的 IF ELSE 块来做到这一点;

CREATE TABLE #table (Column1 varchar(10), Column2 varchar(10))
INSERT INTO #table
VALUES
('column1', 'column2')

DECLARE @Check bit; SET @Check = 0

IF @Check = 1 
(SELECT Column1, Column2
FROM #table)

ELSE

(SELECT Column1
FROM #table)

将变量从 0 更改为 1 以进行测试以查看列数的变化。

Rich Benner 为您提供了一个很好的解决方案,作为替代方案,您可以使用这样的动态 sql:

DECLARE  @sqlvar VARCHAR(100)
select @Sqlvar= ' SELECT Column1, Column2 '+IIF (@check=1,',OptionalColumn','')+' from TABLE';
EXECUTE sp_executesql @sqlvar 

有关 sp_ executesql 的参考:[https://msdn.microsoft.com/it-it/library/ms188001(v=sql.120).aspx]

可以使用 IF ELSE 块。 请试试这个。

--Creating a Table.
CREATE TABLE #MyTable 
    (
    Column1 VARCHAR(10), 
    Column2 VARCHAR(10),
    OptionalColumn VARCHAR(10)
    )
--Inserting value to the Table.
INSERT INTO #MyTable
VALUES('Value 1', 'Value 1','Optional Value')

--IF ELSE Logic to desired output.
DECLARE @Check bit 
SET @Check = 0

IF @Check = 1 
    (
    SELECT 
        Column1, 
        Column2
    FROM 
        #MyTable
    )
ELSE
   (
    SELECT 
        Column1, 
        Column2,
        OptionalColumn
    FROM 
        #MyTable
    )

我发现为此目的使用临时表非常简洁易读,并且不需要重复查询或大的逻辑分支。

创建一个包含您需要的所有列的临时表。 使用 IF 语句从临时表中删除您不想显示的列。 最后,来自临时表的 select *。

这也将允许您使用返回的数据来确定是否保留该列。

 IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL DROP TABLE #tempTable;
 select '---' as [1],
 '---' as [2],
 '---' as [3],
 '---' as [4],
 '---' as [5],
 '---' as [6],
 '---' as [7],
 null as [8]
 into #tempTable 

if RAND() > .5
begin
    alter table #tempTable drop column [1]
end

if RAND() > .5
begin
    alter table #tempTable drop column [2]
end

if RAND() > .5
begin
    alter table #tempTable drop column [3]
end

--Query using result set to dertmine if column should be dropped
if (select count(*) from #tempTable where [8] is not null) = 0
begin
    alter table #tempTable drop column [8]
end

select * from  #tempTable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM