【问题标题】:How to check if a DB array matches any values of a given array如何检查数据库数组是否匹配给定数组的任何值
【发布时间】:2020-09-13 19:39:38
【问题描述】:

我有点卡住了。

我有一个包含天气代码(如雨、雪等)的 SQL 列 它以逗号分隔,因此该列的值类似于

雨、雪、霾

现在,我想从数组中选择包含值的行。

我有一个类似这样的 SQL 代码:

SELECT * FROM locations WHERE currentWeather IN ('rain', 'snow', 'cloudy') ORDER BY name ASC

问题在于,当 currentWeather 列仅包含一项时,这显然有效。 有没有办法做到这一点,如果列值包含给定数组中的任何项目,它会选择它?

另外,如果两个项目匹配,它会选择它两次吗?

最好的祝福

【问题讨论】:

    标签: php mysql sql mariadb


    【解决方案1】:

    在子选择中使用 unnest。

    Select distinct A.myArray from (select unnest(column) as myArray from table) A where A.myArray in (your words to filter for)

    请注意,在 sql 中使用数组不是很理想,并且不遵循规范化规则。理想情况下,您的表不应包含数组,而应仅包含几行,每行包含您想要的特定值。它可以防止诸如此类的问题。

    为避免选择重复值,请在编写 select 后立即使用 Distinct 关键字。

    参考:

    https://www.w3resource.com/PostgreSQL/postgresql_unnest-function.php

    【讨论】:

    • 这对 MariaDB 有用吗?编辑相关列等后,我收到错误:database.unnest 不存在
    • 不,MariaDB 本质上是 MySQL 的一个分支,在 MySQL 中没有等价于 unnest。当您有 SQL 问题时,请记住包含一个引用您正在使用的 DMBS 的标签,或者至少在帖子中提及它。请问你想用这个做什么?不是从 SQL 角度,而是从代码?在程序级别上很可能有解决您的问题的方法。
    • 啊,那很烦人。我可能不得不重新设计我如何尝试这个问题。我意识到我错过了数据库,所以我添加了它,但不幸的是我认为没有简单的方法:(
    • 但是再一次,你想在你的程序中做什么?我有一种感觉,无论您尝试做什么,都可以在程序级别上完成。例如,您可以从 SQL 中检索整个数组,将其存储在程序中的变量中,然后实现逻辑以仅从数组中选择您想要的单词。无论如何,我已经回答了您提出的问题,请考虑选择我的答案。
    • 所以,我试图只打印出存在一个或多个“允许”值的位置,可以这么说。我认为 SQL 中可能有一个“explode”函数可以让我使用逗号分隔的值,但似乎没有,所以我认为你是对的,而且在程序级别更容易做到这一点。
    【解决方案2】:
    WHERE FIND_IN_SET(currentWeather, "rain,snow,cloudy")
    

    (仅)以逗号分隔字符串以查看 currentWeather 是否是这 3 个“单词”中的任何一个。

    另见FIELD(...)

    【讨论】:

    • 如果 currentWeather 也是一个逗号分隔值,例如 ('snow', haze'),这会起作用吗?
    • 不,这需要一个字符串作为参数,并在内部用逗号分隔每个单词。此外,我不相信这会对您的情况有所帮助,因为这只会找到第一次出现并且它会停止查找,而且,这只会返回字符串的位置,它不会返回字符串本身。我家里没有MySql来测试它是否可以将一列作为参数。您可以尝试将 currentWeather 作为第二个参数传递,看看会发生什么,但就像我说的,我认为这不会解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2017-07-31
    • 2018-06-27
    • 2019-11-29
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多