SQL - 查询字符串是不是包含列中的部分值

Posted

技术标签:

【中文标题】SQL - 查询字符串是不是包含列中的部分值【英文标题】:SQL - Query to find if a string contains part of the value in ColumnSQL - 查询字符串是否包含列中的部分值 【发布时间】:2015-06-06 00:16:42 【问题描述】:

我正在尝试编写一个查询来查找字符串是否包含 Column 中的部分值(不要与查找列是否包含字符串的一部分的查询混淆)。

例如,我在表中有一个包含值的列

ABC,XYZ

如果我给出搜索字符串

ABCDEFG

然后我希望显示带有 ABC 的行。

如果我的搜索字符串是 XYZDSDS,那么应该显示值为 XYZ 的行

【问题讨论】:

请澄清您的问题并充分描述它应该如何与更多示例一起使用。目前有太多的未知数。您的列是否始终包含 3 个字符?您可以匹配匹配字符串中的任何位置(不仅仅是开头)吗? 【参考方案1】:
Select * from table where @param like '%' + col + '%'

【讨论】:

谢谢。它有助于。只是一个小小的修改。 Select * from table where @param like '%' ||上校 || '%' 如果我的回答对你有帮助,请点赞并选为正确答案。 这对我不起作用。正确答案是 Turophile 的 这对我也不起作用。当答案需要修改时,为什么要将其标记为已接受的答案@user2354254。【参考方案2】:

首先,您似乎将事物列表存储在一个列中。这是在数据库中存储值的错误方法。您应该有一个联结表,每个实体和值有一行 - 也就是说,在您的示例中,ABCXYZ 有一个单独的行。 SQL 具有用于存储列表的出色数据结构。它被称为“表”,而不是“字符串”。

如果您被这种格式卡住并使用 mysql,有一个功能可以提供帮助:

where find_in_set('ABC', col)

MySQL 将逗号分隔的字符串视为“集合”并提供此功能。但是这个函数不能使用索引,所以效率不是特别高。我有没有提到您应该使用联结表?

【讨论】:

【参考方案3】:

答案是“使用 LIKE”。

查看文档:https://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html

你可以WHERE 'string' LIKE CONCAT(column , '%')

因此查询变为:

select * from t1 where 'ABCDEFG' LIKE CONCAT(column1,'%');

如果需要匹配字符串中的任意位置:

select * from t1 where 'ABCDEFG' LIKE CONCAT('%',column1,'%');

在这里你可以看到它在小提琴中工作: http://sqlfiddle.com/#!9/d1596/4

【讨论】:

如果 column1 被索引,性能影响如何?会不会慢一点?

以上是关于SQL - 查询字符串是不是包含列中的部分值的主要内容,如果未能解决你的问题,请参考以下文章

如何避免作为 sql 查询输出的一部分返回的字符串值被拆分为 bash/shell 脚本中数组中的不同字段

Mysql查找如何判断字段是不是包含某个字符串

查询与 Hive QL 中另一列中的每个值关联的最短字符串值的更有效方法

sql 判断字段中是不是含有字符

我想编写一个 sql (Oracle SQL) 查询来从特定字符之后的列中选择字符串的一部分

关于SQL查询语句中的LIKE模糊查询的解释