【问题标题】:Combine multiple OR and LIKE mySql组合多个 OR 和 LIKE mySql
【发布时间】:2018-05-22 18:11:48
【问题描述】:

我了解 LIKE 不能在 here. 的内部 IN 子句中使用

我的表有 col1, col2, col3 列。

如何使用 LIKE 运算符在多个列中查找多个值。 目前我的查询是:

SELECT col1, col2, col3
FROM table_name
WHERE
(   
    Col1 = '38' 
    OR Col1 LIKE '%,38'
    OR Col1 LIKE '%,38,%' 
    OR Col1 LIKE '38,%'
)
OR
(
    col2 = '38' 
    OR col2 LIKE '%,38'
    OR col2 LIKE '%,38,%' 
    OR col2 LIKE '38,%'
)
OR
(
    col3 = '38' 
    OR col3 LIKE '%,38'
    OR col3 LIKE '%,38,%' 
    OR col3 LIKE '38,%'
)

有没有办法让它更智能/更短/更快? 谢谢!

【问题讨论】:

  • 是的。更正您的数据并停止在同一列中存储多个值,然后您不必费力地将其从逗号分隔值中解析出来。最初不花时间正确定义表的愚蠢决定的问题在于,您最终需要付出 100 倍的努力才能在需要时检索数据。然后变成WHERE (col1 = '38' or col2 = '38' or col3 = '38')
  • 我同意你的观点,表格应该标准化。但现在我必须保持这种传统格式。

标签: mysql sql


【解决方案1】:

您可以使用函数 FIND_IN_SET()。 MySQL 有一个专用函数 FIND_IN_SET(),如果在包含逗号分隔值的字符串中找到该值,则返回字段索引。

示例

DROP TABLE table_name;

CREATE TABLE table_name
(col1 VARCHAR(100));

INSERT INTO table_name VALUES ('38');
INSERT INTO table_name VALUES ('37,38,39');
INSERT INTO table_name VALUES ('37,38');
INSERT INTO table_name VALUES ('38,39');
INSERT INTO table_name VALUES ('48');


SELECT col1
FROM table_name
WHERE FIND_IN_SET(38, col1) > 0;

你的解决方案是

SELECT col1, col2, col3
FROM table_name
WHERE FIND_IN_SET(38, col1) > 0 
  OR FIND_IN_SET(38, col2) > 0 
  OR FIND_IN_SET(38, col3) > 0 ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多