代码之家  ›  专栏  ›  技术社区  ›  Alec Smart

mysql从字符串中选择

  •  3
  • Alec Smart  · 技术社区  · 15 年前

    这是我的X号桌:

    id      vals
    ---------------------
    1       4|6|8|
    

    现在表Y:

    id      name
    --------------------
    1        a
    4        b
    6        c
    8        d
    

    现在我想要以下内容:

    select * from Y where id IN (replace(select vals from X where id = '1'),'|',',')
    

    但这似乎行不通。有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  6
  •   YOU    15 年前

    您可以使用 FIND_IN_SET 而不仅仅是 IN ,正常 关键字无法在一个字段中搜索逗号分隔的值。

    例如

    mysql> select FIND_IN_SET(4, replace('4|6|8|','|',','));
    
    +-------------------------------------------+
    | FIND_IN_SET(4, replace('4|6|8|','|',',')) |
    +-------------------------------------------+
    |                                         1 |
    +-------------------------------------------+
    1 row in set (0.00 sec)
    
        2
  •  0
  •   Amber    15 年前

    replace返回一个字符串,但它是一个字符串值,而不是查询中的字符串。

    你能做的是不用 IN ,使用regexp在原始字符串中匹配,例如:

    vals REGEXP '[[:<:]]4[[:>:]]'
    

    只有当原始字符串中有一个“4”不是较大数字的一部分时才是正确的(因此,如果您有3 44 100,它在“4”上不匹配,但在“44”上匹配)。

    这个 [[:<:]] [[:>:]] 分别是“单词的左侧”和“单词的右侧”。

    要生成该字符串,可以执行以下操作…

    CONCAT('[[:<:]]', CAST(id AS CHAR), '[[:>:]]')