首页 > 解决方案 > 如何使用不总是存在的列执行带有 WHERE 的选择

问题描述

简单的例子:我有一些(几乎)相同的个人数据表(年龄、姓名、体重......)

现在我有一个简单但很长的 SELECT 来查找丢失的数据:

Select ID
from personal_data_a
where 
born is null
or age < 1
or weight > 500
or (name is 'John' and surname is 'Doe')

现在的问题是:我有一些个人数据表,其中“姓”列不存在,但我想对所有这些表使用相同的 SQL 语句。所以我必须检查(在 WHERE 子句中)最后一个 OR 条件仅用于“如果列姓氏存在”。

可以用简单的方式完成吗?

标签: sqloracleselect

解决方案


你应该让所有人都在同一张桌子上。

如果由于某种原因您不能这样做,请考虑创建一个视图。像这样的东西:

CREATE OR REPLACE VIEW v_personal_data
AS
   SELECT id,
          born,
          name,
          surname,
          age,
          weight
     FROM personal_data_a
   UNION ALL
   SELECT id,
          born,
          name,
          NULL AS surname,         --> this table doesn't contain surname
          age,
          weight
     FROM personal_data_b;

接着

SELECT id
  FROM v_personal_data
 WHERE    born IS NULL
       OR age < 1
       OR (    name = 'John'
           AND (   surname = 'Doe'
                OR surname IS NULL))

推荐阅读