【问题标题】:Use single value from comma separated list as parameter使用逗号分隔列表中的单个值作为参数
【发布时间】:2014-07-23 13:46:17
【问题描述】:

我有结构表

id| list (VARCHAR)
--|-------
1 | a, b, c
2 | b, c, d
3 | a

我想在其他查询中使用逗号分隔列表中的单个值作为过滤器。 我想我会用这样的查询来实现这一点

SELECT * FROM A WHERE column1 IN (SELECT list FROM B WHERE id = 1)

但是这种方式我使用价值

a, b, c 

不作为过滤器,例如,

a 

我需要它作为过滤器。

我怎样才能做到这一点?

【问题讨论】:

  • 修复您的数据库结构,这样您就不会将列表存储在逗号分隔的字符串中。 SQL 有一个很好的存储列表的特性。它被称为表。
  • 我无法更改数据库结构 ;)
  • “列表”是什么数据类型...设置?如果是这样,您可能需要使用 FIND_IN_SET dev.mysql.com/doc/refman/5.0/en/set.htmlLike 运算符不是最佳性能,但如果您必须忍受现有的...
  • @xQbert 列表列类型为 VARCHAR
  • 你如何确定应该从逗号分隔值的字符串列表中返回什么“单个”值?为什么是 a 而不是 c 或 b?不管我认为如果您不能更改数据库结构,最好的方法是编写一个用户定义的函数,该函数将返回系列中的第一个值,除非用户指定要返回的系列中的位置,在这种情况下 UDF 将返回该职位的价值。您无法转换为可能有帮助的设置数据类型或从该数据类型转换,因此如果结构无法更改,UDF 似乎最好;因为从长远来看,您会需要它。

标签: mysql sql


【解决方案1】:

一种方法是使用find_in_set()like。这是一个例子:

SELECT *
FROM A a JOIN
     B b
     ON b.id = 1 and
        find_in_set(a.column1, replace(list, ', ', ',')) > 0;

【讨论】:

    【解决方案2】:

    如果你想要你请求的列表中的第一个值,那么你可以这样做。

    SELECT * 
    FROM A 
    WHERE column1 IN 
    (
        SELECT 
            SUBSTRING_INDEX(`list`, ',', 1) 
        FROM B 
        WHERE id = 1
    )
    

    您可以通过更改 SUBSTRING_INDEX() 中的数字来获取字符串的任何部分..

    SUBSTRING_INDEX(`list`, ',', 1) -- find first comma and return first part
    SUBSTRING_INDEX(`list`, ',', -1) -- find last comma and return last part
    SUBSTRING_INDEX(`list`, ',', -2) -- find second to last comma and return last part
    SUBSTRING_INDEX(`list`, ',', 2) -- find second to first comma and return first part
    .... etc
    

    【讨论】:

    • 谢谢,但我不想要第一个值,也许我做了糟糕的解释。我想要列表列中该行的任何逗号分隔值。
    • @Miki 好的,在这里寻找要使用的功能。我以前用过它,它很有帮助blog.fedecarg.com/2009/02/22/mysql-split-string-function
    • @Miki 你能发布你希望列表看起来像什么结果吗?
    • 听起来他想基于逗号旋转并将结果作为多行返回。
    • @xQbert 它是重复的。请参阅我对这个问题的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2017-03-17
    相关资源
    最近更新 更多