【问题标题】:Oracle : IN and OR甲骨文:IN 和 OR
【发布时间】:2016-04-26 05:45:12
【问题描述】:

我有一个处理 Oracle 数据库中许多数据的场景。在某些情况下,变量Sec_email 将包含许多值,而在某些情况下Sec_email 将包含null' '。 那么谁能告诉我如何为此编写查询?

我试过了

(C.SECONDARY_EMAIL IN ('?,?') OR '' = '' )

其中 C 是客户端表。

当我使用它时,我得到的计数为 0。

【问题讨论】:

  • OR '' = '' 适用于所有记录。
  • @Raja Anbazhagan:实际上,在 Oracle 中''null 相同,所以'' = '' 始终为假。
  • 在那种情况下OR '' = '' 是必要的吗?
  • 您提到在某些情况下 sec_email 将包含 许多值许多值是什么意思?是数组还是逗号分隔的字符串?
  • 未知。 '' = '' 在 Oracle 上与 NULL = NULL 相同,其真值 UNKOWN。 (如果你接受否定,这很重要,但在这种情况下并不重要。)

标签: sql oracle conditional-statements


【解决方案1】:

您可以在IN 比较之前执行非空检查,例如

Sec_email is not null and C.SECONDARY_EMAIL IN (...

【讨论】:

    【解决方案2】:

    一个明显的问题是Oracle(默认情况下)将空字符串视为NULL。所以:'' = ''NULL = NULL 相同,这绝不是真的。

    啊。

    无论如何,您可能正在构建查询,因此请改用is null

    (C.SECONDARY_EMAIL IN ('?,?') OR '' IS NULL 
    

    不过,我认为真正的问题是第一次比较。 IN 列表有一个带有常数的元素,而不是两个(但也许这是您的意图)。如果要放置可变数量的值进行比较,一种方法是使用正则表达式。例如:

    C.SECONDARY_EMAIL REGEXP_LIKE '^val1|val2|val3$' or '' IS NULL
    

    【讨论】:

    • 您的意思是使用类似正则表达式的功能吗? like 运算符不执行正则表达式。
    • @ShannonSeverance 。 . .是的,这正是我的意图。我不知道为什么我的手指没有打字。
    • 当我使用这个时,我没有得到完整的数据。
    【解决方案3】:

    如果您想在其中一些为空时获取值列表,您应该使用:

    ("some other conditions" OR C.SECONDARY_EMAIL IS NULL)
    

    问题是如果它不是 null 并且不是 ' ' 值你所期望的,如果它应该是一些国王 模式你应该使用正则表达式:

    regexp_like(C.SECONDARY_EMAIL, '^(.+?[,]+?)+$')
    

    此外,如果您在 where 子句中使用了一些条件,则应使用括号将您的条件分组为空检查和另一个。

    这种情况下的所有条件都将除以OR

    (C.SECONDARY_EMAIL IS NULL OR regexp_like(C.SECONDARY_EMAIL, '^(.+?[,]+?)+$'))
    

    (C.SECONDARY_EMAIL IS NULL OR  regexp_like(C.SECONDARY_EMAIL, '^(.+?[,]+?)+$')
     OR C.SECONDARY_EMAIL = ' ')
    

    【讨论】:

    • 我没有得到完整的数据。
    • 那么您应该选择适合您条件的正则表达式。描述你想得到的值,如果它不为 null 也不
    • 它总是采用OR 条件。当不考虑IS NULL 条件时。
    • 现在我正在尝试AND (c.SECONDARY_EMAIL IN ('') OR c.SECONDARY_EMAIL IS NOT NULL)
    • 总记录在 19+ 左右,在 '1043022' 值中只有 2 个。当我传递像 C.SECONDARY_EMAIL IN '1043022' 这样的值时,我得到的结果是 19+
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2012-07-03
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多