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】:首先,您似乎将事物列表存储在一个列中。这是在数据库中存储值的错误方法。您应该有一个联结表,每个实体和值有一行 - 也就是说,在您的示例中,ABC
和 XYZ
有一个单独的行。 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 脚本中数组中的不同字段
查询与 Hive QL 中另一列中的每个值关联的最短字符串值的更有效方法