2016-12-07 22 views
4

我只需要选择一列,只要它存在于表中,否则它可以设置为空。SQL - 有条件地选择列(如果存在的话)

下面

样品台,可以说该marks山坳是没有必要存在,所以需要的,如果它存在

表1进行检查:

name marks 
joe 10 
john 11 
mary 13 

查询:

select 
    name, 
    marks if it exists else null as marks1 -- pseudo code 
from 
    table1 

应该选择哪一行marks

+0

你会如何*不知道'marks'是table1上的一列吗? –

+0

您应该**重新考虑您管理数据库架构和迁移的方式。不知道列是否存在的事实可能表明您正在使用错误的过程在数据库中创建和更新表。另外:拥有'marks1'表也可能是非标准化设计的标志。你可以使用动态SQL来实现类似的功能,但它可以更好地解决你管理表的方式 –

+1

@a_horse_with_no_name同意更广泛的观点 - 但这不是模式和移植的问题 - 现实世界的数据很混乱:)并且上下文不是应用程序,而是来自我无法控制的来源的一些真实世界数据 - 它可能或可能不是所有期望的列 - 问题真的在此上下文中,如果可能的话为此进行一些检查。 – user3206440

回答

0

试试这个:

IF EXISTS(SELECT 1 
      FROM information_schema.columns 
      WHERE table_name='your_table' and column_name='your_column') THEN 
    SELECT your_column as 'some_column' 
ELSE 
    SELECT NULL as 'some_column' 
END IF 
+0

如果EXISTS()不是sql ... –

+0

@EvanCarroll PostgreSQL不支持'EXISTS()'? –

+0

是的,在'plpgsql'中。这是一种过程式语言,它是PostgreSQL支持的语言之一。但是,这不是SQL。你不能只运行一个在程序语言中有效的代码片段。 –

0

试试这个

IF COL_LENGTH('your_table_name','column_name_you_want_to_select') IS NULL BEGIN 
--This means columns does not exist or permission is denied 
END 
else 
--Do whatever you want 
5

SQL就不允许。结果集有两种选择:

  1. 静态列入
  2. 所有的表或子查询通过柱扩张与*tbl.*

或许这将满足您的需求,SELECT * FROM table1;您总能获得该列,如果存在。