如何在包含 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;
我想比较同一行中 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;