当前位置: 首页 > 面试题库 >

如果该列存在,则选择columnValue,否则为null

韦智刚
2023-03-14
问题内容

我想知道是否可以选择列的值(如果该列存在),否则选择null。换句话说,当列不存在时,我想“举起” select语句来处理这种情况。

SELECT uniqueId
    ,  columnTwo
    ,  /*WHEN columnThree exists THEN columnThree ELSE NULL END*/ AS columnThree
FROM (subQuery) s

注意,我正在巩固我的数据模型和设计。我希望在接下来的几周中排除这种逻辑,但是我真的想超越这个问题,因为html" target="_blank">数据模型修复比我现在想解决的要耗费更多时间。

另请注意,我希望能够在一个查询中执行此操作。所以我不是在寻找像这样的答案

首先检查子查询中的列。然后修改您的查询以适当地处理您的子查询中的列。


问题答案:

您不能使用简单的SQL语句来执行此操作。除非存在表中的所有表和列引用,否则SQL查询将不会编译。

如果“子查询”是表引用或视图,则可以使用动态SQL进行此操作。

在动态SQL中,您将执行以下操作:

declare @sql nvarchar(max) = '
SELECT uniqueId, columnTwo, '+
    (case when exists (select *
                       from INFORMATION_SCHEMA.COLUMNS 
                       where tablename = @TableName and
                             columnname = 'ColumnThree' -- and schema name too, if you like
                      )
          then 'ColumnThree'
          else 'NULL as ColumnThree'
     end) + '
FROM (select * from '+@SourceName+' s
';

exec sp_executesql @sql;

对于实际的子查询,您可以通过检查子查询是否返回具有该列名的内容来近似相同的内容。一种方法是运行查询: select top 0 * into #temp from (<subquery>) s然后检查中的列#temp

编辑:

我通常不会更新这样的旧问题,而是基于下面的评论。如果“子查询”中的每一行都有唯一的标识符,则可以运行以下命令:

select t.. . .,  -- everything but columnthree
       (select column3   -- not qualified!
        from t t2
        where t2.pk = t.pk
       ) as column3
from t cross join
     (values (NULL)) v(columnthree);

如果子column3查询不存在,它将从外部查询中选取。但是,这严重取决于每行具有唯一的标识符。问题明确地是关于子查询的,没有理由期望行可以轻松地唯一标识。



 类似资料:
  • 问题内容: 使用Sql Server2012。我有一个存储过程,它的一部分检查用户名是否在表中。如果是,则返回1,否则返回2。这是我的代码: 但是,我一直收到以下错误: ‘1’附近的语法不正确。 使用IF EXIST甚至可以做到吗? 问候 问题答案: 如果您想这样做,那么这就是您要遵循的语法。 您不一定严格要求这些语句,但是最好是从一开始就养成这种习惯。

  • 问题内容: 我有2张桌子,一张用于会员,另一张用于他们的服务。这些是MySQL 5.6服务器上的InnoDB表。 会员表: 服务表: 我尝试达到以下结果: 因此,如果服务表中存在用户ID,则列服务将为true或false。 我尝试使用JOIN和子查询来完成此操作,但没有成功,因此我需要您的帮助;) 问题答案: 使用服务表,请尝试此查询

  • 问题内容: 尝试通过一些非常有限的知识和经验来进行SQL查询。尝试了很多我通过搜索发现的内容,但没有得出我想要的结果。 我有四个表: 回复:KITS-[KIT_NO]和[ITEM_NO]都位于ITEMS表中。它们的串联是PK。 我想选择ORDERS,ORDERS.DATE,ORDER_DETAILS.ITEM_NO,ITEMS.DESC 没问题。一些简单的内部联接,我在路上。 困难在于在selec

  • 问题内容: 在一个SQL语句中,我尝试插入一行,如果由于约束而失败,则返回现有行。 我有: 该列具有唯一约束。我尝试在末尾追加,但这仍然不返回现有行。 为什么是这样?我以为我的最后一条语句将被执行并返回。有任何想法吗? 注意:由于某些复杂的竞争条件,我无法使用Postgres函数或多个SQL语句。 问题答案: WITH d(t, e) AS ( VALUES (‘abcdefg’, ‘2014-0

  • 问题内容: 我有一个带有2个表的数据库,如下所示: 列是,并且是 和 在申请表中,我有2个编辑框,名称分别为和 如果用户像电子邮件一样插入一个新的负责人姓名, 那么在保存表格的过程中,我想将新的负责人姓名插入表中,请插入最后一个并将其更新为。 如果用户保持名称,但它更新电子邮件一样,然后我想在从1 =使用新的电子邮件地址和他们(其余和)保持不变。 如果负责人的名称相同,我想保留from表的原始引用

  • 问题内容: 我在node.js中编写一个函数来查询PostgreSQL表。 如果该行存在,我想从该行返回id列。 如果不存在,我想将其插入并返回ID()。 我一直在尝试和语句的变体,但似乎无法使其正常工作。 问题答案: 我建议在数据库端进行检查,然后将ID返回给nodejs。 例子: 而不是在Node.js端(在此示例中,我使用的是node-postgres):