【问题标题】:Query Multiple Columns where one or more columns have a value查询多个列,其中一个或多个列具有值
【发布时间】:2021-02-17 00:45:22
【问题描述】:

我正在尝试查询 Oracle 数据库上的表。它有 4 列:

  • ID(编号)
  • 电子邮件(Varchar)
  • 电话(Varchar)
  • 传真(Varchar)。

ID 是唯一标识符,并且是必需的。剩下的 3 列可以有一个值,可以是 NULL,也可以是一个空字符串。所以,类似:

| ID | EMAIL          | PHONE        | FAX            |
| -- | -----------    | ------------ | -------------- |
| 10 | na@na.ca       |888-888-8888  | NULL           |
| 11 |                |NULL          |                |
| 12 | buiness@biz.ca |              | 666-666-6666   |
| 13 |                |NULL          | 555-555-5555   |
| 14 |NULL            |              | NULL           |
| 15 |NULL            |222-222-2222  | NULL           |

我正在尝试构建一个查询,该查询仅消除跨 EMAIL、PHONE 或 FAX 没有实际值的行(即不包含电子邮件地址、电话号码或传真号码的行)。上表中的示例是 ID 为 11 和 14 的行。因此,如果至少有一个或全部电子邮件、电话或传真,我想在我的查询中包含这些行。

我玩过几个查询,但似乎无法得到我想要的结果。我原以为这会很容易,但也许现在已经很晚了。我的查询的最新版本是这样的:

SELECT c.id, c.email, c.fax, c.phone
FROM 
  table c
where
  (c.email is not NULL or c.email <> '') or
  (c.fax is not NULL or c.fax <> '') or
  (c.phone is not NULL or c.phone <> '')

上面的查询似乎只导致具有所有 3 个值的行。我用一些'where not'子句和'or's'和'and's'的混合对查询进行了一些修改,但是我没有得到我想要的。任何帮助将不胜感激。

【问题讨论】:

  • 我对这个问题有点困惑。 Oracle 将空字符串和 NULL 值视为相同。 “NULL”真的是'NULL'吗?
  • @Gordon Linoff 您过去回答过我的一个或两个问题,并且似乎总是能提供很好的洞察力。我在我的一个专栏(即 TRIM(c.email) IS NULL )上测试了你的理论,发现许多“空”单元格中有很多空格,这解释了为什么我的查询没有得到响应那。谢谢你的建议。如果您使用删除空格的选项提交我的问题的答案,我将接受答案并投票。干杯。

标签: sql oracle multiple-columns


【解决方案1】:
SELECT c.id, c.email, c.fax, c.phone
FROM 
  table c
where NOT
(coalesce(email,'')='' and coalesce(fax,'')='' and coalesce(phone,'')='')

【讨论】:

    【解决方案2】:

    在某些情况下(例如 ID 10 的传真),“null”实际上是作为字符串值存在的吗?如果是这样,则此查询有效:

        select id, email, phone, fax
        from table_name
        where 
         (email is not null and email <> 'NULL') or
         (fax is not null and fax <> 'NULL') or
         (phone is not null and phone <> 'NULL')
    

    【讨论】:

    • 很好的答案。请参阅我在原始帖子中的评论,以了解导致我的问题的原因。谢谢
    【解决方案3】:

    似乎空的varchar 值在Oracle 中被视为NULLthis answer 点。

    因此,可以将字符串与可空值进行比较,并反转所有空值的查询结果。

    鉴于某些列中有很多空格,如注释:

    SELECT * FROM example c
    WHERE NOT (
      TRIM(c.email) IS NULL AND 
      TRIM(c.phone) IS NULL AND
      TRIM(c.fax) IS NULL
    )
    

    【讨论】:

    • 很好的答案。请参阅我在原始帖子中的评论,以了解导致我的问题的原因。谢谢
    • 欢迎您,迈克!我已经编辑了答案以涵盖许多空格的情况。
    【解决方案4】:

    我认为您可以与 where 子句中的每个条件进行联合。所以是这样的:

    (SELECT * FROM C WHERE email is not NULL or email <> '') UNION
    (SELECT * FROM C WHERE fax is not NULL or fax <> '') UNION
    (SELECT * FROM C WHERE phone is not NULL or phone <> '')
    

    【讨论】:

      【解决方案5】:

      您需要选择具有空值或空字符串的列,而不是选择不包含 null 或空字符串的列。在两个条件之间,您需要使用 and 而不是 or 因为您需要选择所有三列均为空或空的行。请尝试以下查询

      选择 c.id、c.email、c.fax、c.phone 从 表c 在哪里 (c.email 为 NULL 或 c.email '=')和 (c.fax 为 NULL 或 c.fax = '')和 (c.phone 为 NULL 或 c.phone = '')

      【讨论】:

        猜你喜欢
        • 2021-09-12
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多