【问题标题】:Checking multiple values in a SQL array检查 SQL 数组中的多个值
【发布时间】:2011-07-15 20:32:59
【问题描述】:

我需要检查 SQL 数组中是否存在多个值中的一个(或多个)。 最简单的形式是这样的:

SELECT
  (1, 7, 8) IN (1, 2, 3, 4, 5)
FROM DUAL

显然这个说法是行不通的。只有在我检查数组中的一个值时它才有效。但我需要知道我提供的一个(不是全部!)值是否存在于 SQL 数组中。如果数组中存在一个或多个值,则该语句应返回 TRUE,如果没有,则应返回 FALSE。

我意识到我可以像这样添加几个检查:

SELECT
   1 IN (1, 2, 3, 4, 5)
OR 7 IN (1, 2, 3, 4, 5)
OR 8 IN (1, 2, 3, 4, 5)
FROM DUAL

然而,我的编程逻辑以数组格式“(1,7,8)”提供值,并且每次我需要运行 SQL 语句时,该数组中的值的数量都会有所不同。如果我能以某种方式将这个数组粘贴到我现有的 SQL 语句中,而不是在每次运行时重新构建 SQL 语句,并为数组中的每个值创建“OR”语句,那将非常方便。

有没有办法做到这一点?顺便说一句,我正在使用 MySQL。

提前感谢,继续保持良好的编程!

【问题讨论】:

  • 您的“编程逻辑”是否有可能传递一个表,因为 SQL 最适用于表,而不是分隔列表?
  • 这张桌子会是什么样子?如果它类似于: SELECT (1,7,8) FROM DUAL 那么这是可能的,但我可以将其构建到 SQL 语句中。我仍然看不到如何测试 SQL 数组的值。
  • 在 .net 中类似于 datatable 或数组。逗号分隔的列表不是数组,而是字符串。
  • 为什么需要在 (My)SQL 中评估它?
  • 我明白这一点,但我想将这些值粘贴到现有的 SQL 语句中,因此我将数组转换为逗号分隔的列表。

标签: mysql sql arrays


【解决方案1】:

您可以将 REGEXP 与逗号分隔的字符串一起使用。您必须先将值转换为字符串。

SELECT REPLACE(CONCAT(",", "1, 7, 8", ",")," ", "")
       REGEXP CONCAT(",", REPLACE(REPLACE("1 ,2 , 3 , 4 ,5 " ," ", ""),",", ",|,"), ",")
FROM DUAL

解释:

  • 这仅适用于逗号分隔的字符串,不适用于您的列表 例子。
  • 该语句从字符串中删除所有空格。
  • 在字符串的两端添加逗号以避免部分匹配。
  • 在正则表达式模式中,所有逗号都替换为逗号 + 竖线符号 + 逗号,所以它 用作 OR ,同时避免部分匹配。

【讨论】:

    【解决方案2】:

    您可以使用简单连接创建动态/临时表并与其他值进行简单连接吗?

    create table a (
    id int);
    
    insert into a values (1),(7),(8);
    
    create table b like a;
    
    insert into b values (1),(2),(3),(4),(5);
    
    
    select a.* from a
    inner join b
    on a.id = b.id
    

    【讨论】:

    • 我很好奇您的答案和SELECT a.* from a where a.id IN (SELECT b.id FROM b) 的查询计划是否相同。你认为EXPLAIN 会显示这两个查询实际上是相同的吗?
    • @柯克奥尔森。别客气。 @克里斯坎宁安。我通常倾向于避免使用 IN 子句,因为 AFAIK 它在 mysql 版本
    • @nick rulez 我希望柯克会为我们运行EXPLAINS 并让我们知道。还有时间成为专家!
    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多