【问题标题】:SQL Using to_char(null), to_number(null), etc in set operators with OracleSQL 在 Oracle 的集合运算符中使用 to_char(null)、to_number(null) 等
【发布时间】:2013-01-05 03:00:38
【问题描述】:

我是第一次进入 SQL 世界的学生,我找不到任何关于如何使用 to_somedatatype(null) 替换 UNION、INTERSECT 等中缺失列的清晰易懂的文档。我是在我的前几个项目中使用 Oracle 数据库内置的 HR 模式,并且以下查询有效(我得到了一个只有那些有家属的员工的employee_id 编号列表):

SELECT employee_id "Employees with Dependents"
FROM employees
INTERSECT
SELECT relative_id
FROM dependents;

但是,只要我想包含员工的姓名和受抚养人的出生日期,我就被卡住了。此变体执行无错误搜索但不产生任何结果(输出“未选择行”):

SELECT e.employee_id "Employees with Dependents",
  e.first_name,
  e.last_name,
  to_date(NULL) "Dependent Birthdate"
FROM employees e
INTERSECT
SELECT d.relative_id,
  TO_CHAR(NULL),
  TO_CHAR(NULL),
  d.birthdate
FROM dependents d;

将 to_date 替换为 to_number 或只是纯 null 和 to_char 替换为 to_varchar2 或 null 的几种变体无法生成任何行。

我想为每个受抚养人生成一行,其中显示监护人的雇员编号、名字、姓氏和受抚养人的出生日期。我相信我的问题是使用这些空占位符,再加上对集合运算符的一般理解有限。 (我的理解是,当我使用像 to_date(null) 这样的空占位符时,它不会包含在比较中,因为没有什么可以比较的。)

有人可以向我解释如何正确使用这些占位符吗?

【问题讨论】:

    标签: sql oracle intersect to-char set-operations


    【解决方案1】:

    您必须匹配数据类型(使用 TO_CHAR 函数或 任何其他转换函数)当列不存在时 一张或另一张桌子。例如:

    SELECT location_id, department_name "部门", TO_CHAR(NULL) "仓库位置" 从部门 联盟 SELECT location_id, TO_CHAR(NULL) "部门", state_province 从位置;

    让你与你的场景联系起来

    【讨论】:

      【解决方案2】:

      您的查询不起作用的原因是相应字段中没有 NULL 值。您正在使用INTERSECT。实际上,您想将这些表连接在一起,例如:

      SELECT e.employee_id "Employees with Dependents",
        e.first_name,
        e.last_name,
        d.birthdate "Dependent Birthdate"
      FROM employees e join
           dependents d
           on d.relative_id = e.employee_id
      

      【讨论】:

      • 所以你的意思是在相交、联合或减号中使用类似 to_date(null) 的东西是比较的一部分,并且会像在某些列中搜索空值一样工作?例如,搜索没有记录出生日期的家属?
      • @TroyD 。 . .是的。事实上,intersect 操作很少使用。您应该学习和使用 joingroup by -- 更有用。
      • 我们也在学习这方面的知识,但是材料是非常技术性的......这些示例看起来好像可以通过相交来实现。谢谢你的帮助。您使用 Join 的建议让我重回正轨!
      猜你喜欢
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2023-03-23
      • 2022-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多