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

时间:2015-12-30 21:26:59

标签: mysql sql mariadb

我希望比较同一行中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

我希望返回Col_A' b'之间的比较次数。和Col_B' b'是的。

6 个答案:

答案 0 :(得分:2)

这就是我想要的:

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

答案 1 :(得分:2)

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

SELECT COUNT(*) FROM MyTable WHERE Col_A LIKE CONCAT('%',Col_B,'%');
从性能角度来看,

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

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;

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果列Col_a的数据格式为 table,row,cell ,那么搜索表达式将是下一个:

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

答案 4 :(得分:0)

最简单的方法是使用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

答案 5 :(得分:0)

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

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

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

请注意,如果表很大,这将是非常慢,因为它无法索引MySQL中的子字符串。如果您对模式进行规范化,那么每个字段都在一个单独的列中会好得多。

相关问题