两列数据,每一列中用逗号连接了许多字段且顺序不一样,如何找出数据不一样的行
时间: 2024-03-26 20:39:14 浏览: 55
您可以使用 MySQL 中的 `FIND_IN_SET` 函数来完成该操作。具体步骤如下:
1. 使用 `LEFT JOIN` 语句将同一个表中的两列数据进行连接,连接的条件是两列数据中的主键相同。
2. 在 `WHERE` 子句中使用 `FIND_IN_SET` 函数,比较两列数据中的每个字段值是否相同。
3. 使用 `IS NULL` 子句过滤掉两列数据完全相同的行,只留下数据不同的行。
示例 SQL 语句如下:
```
SELECT A.*, B.*
FROM table_name A LEFT JOIN table_name B
ON A.primary_key = B.primary_key
WHERE (
SELECT COUNT(*) FROM (
SELECT * FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(A.column_1, ',', n), ',', -1) AS value
FROM table_name A INNER JOIN (
SELECT 1 + units.i + tens.i * 10 AS n
FROM (
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) units, (
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) tens
) N
ON CHAR_LENGTH(A.column_1)
- CHAR_LENGTH(REPLACE(A.column_1, ',', ''))
>= N.n - 1
WHERE A.primary_key = A.primary_key
ORDER BY n
) T
GROUP BY value
) X
) <> (
SELECT COUNT(*) FROM (
SELECT * FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(B.column_2, ',', n), ',', -1) AS value
FROM table_name B INNER JOIN (
SELECT 1 + units.i + tens.i * 10 AS n
FROM (
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) units, (
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) tens
) N
ON CHAR_LENGTH(B.column_2)
- CHAR_LENGTH(REPLACE(B.column_2, ',', ''))
>= N.n - 1
WHERE B.primary_key = A.primary_key
ORDER BY n
) T
GROUP BY value
) Y
)
AND B.primary_key IS NOT NULL;
```
请将上面的 SQL 语句中的 `table_name` 替换成您要查询的表名,`primary_key` 替换成您要比较的主键列名,`column_1` 和 `column_2` 替换成您要比较的两列数据的列名。
这个 SQL 语句会返回两列数据中有不同的行,并忽略两列数据完全相同的行。
阅读全文