如何在包含 SQL 中另一个单元格的字符串的单元格子字符串中搜索字符串

How do I search for a string in a cell substring containing a string from another cell in SQL

我想比较同一行中 2 个单元格的结果。数据的结构方式本质上是这样的:

Col_A: table,row,cell   
Col_B: row

我想做的是比较 Col_A 'row' 与 Col_B 'row'

SELECT COUNT(*) FROM MyTable WHERE Col_A CONTAINS Col_B;

示例数据:

Col_A: a=befd-47a8021a6522,b=7750195008,c=prof    
Col_B: b=7750195008

Col_A: a=bokl-e5ac10085202,b=4478542348,c=pedf
Col_B: b=7750195008

我正在查看 return Col_A 'b' 和 Col_B 'b' 之间的比较为真的次数。

SELECT * FROM MyTable WHERE Col_A = Col_B (AND Col_A = 'cell')

^^ 也许你正在寻找这个声明。括号中的部分是可选的。 如果这不是解决方案,请向我们提供更多信息。

如果列 Col_a 的数据格式为 table,行,单元格 ,则下一个搜索表达式为:

SELECT COUNT(*) FROM MyTable AS MT
WHERE SUBSTRING(Col_A, 
                INSTR(Col_A, ',b=') + 3, 
                INSTR(Col_A, ',c=') - INSTR(Col_A, ',b=') + 3) = Col_B

最简单的方法是使用 IN 运算符。

SELECT COUNT(*) FROM MyTable WHERE Col_A IN (Col_B);

有关 IN 运算符的更多信息:http://www.w3schools.com/sql/sql_in.asp

还有 SUBSTRING()MID()(取决于您使用的是什么)函数,如果您知道子字符串每次都会在相同的位置。

MID()/SUBSTRING() 函数:http://www.w3schools.com/sql/sql_func_mid.asp

这正是我要找的:

SELECT COUNT(*) FROM MyTable WHERE Col_A LIKE CONCAT('%',Col_B,'%');

您可以使用 SUBSTRING_INDEX 从列中提取分隔字段。

SELECT COUNT(*)
FROM MyTable
WHERE Col_B = SUBSTRING_INDEX(SUBSTRING_INDEX(Col_A, ',', 2), ',', -1)

您需要调用它两次才能获得一个字段。内部调用获取前两个字段,外部调用获取最后一个字段。

请注意,如果 table 很大,这将 非常 慢,因为无法索引 MySQL 中的子字符串。如果您规范化您的架构,那么每个字段都在一个单独的列中,那就更好了。

我看到你回答了你自己的问题。

SELECT COUNT(*) FROM MyTable WHERE Col_A LIKE CONCAT('%',Col_B,'%');

从性能角度来看很好。虽然标准化是 非常 的好主意,但在这种特殊情况下它不会提高速度。我们必须简单地扫描 table 中的所有字符串。问题是,如果查询总是正确的。它接受例如

Col_A: a=befd-47a8021a6522,ab=7750195008,c=prof    
Col_B: b=7750195008

Col_A: a=befd-47a8021a6522,b=775019500877777777,c=prof    
Col_B: b=7750195008

这可能是一个问题,具体取决于数据格式。解决方法很简单

SELECT COUNT(*) FROM MyTable WHERE CONCAT(',',Col_A,',') LIKE CONCAT('%,',Col_B,',%');

但这还没有结束。 LIKE 中的字符串被解释,如果您的数据中可以包含 % 之类的内容,那么您就有问题了。这应该适用于 mysql:

SELECT COUNT(*) FROM MyTable WHERE LOCATE(CONCAT(',',Col_B,','), CONCAT(',',Col_A,','))>0;