您可以在 Oracle 中使用UNPIVOT:
SQL Fiddle
Oracle 11g R2 架构设置:
CREATE TABLE table_name ( ID, COL1, COL2, COL3, COL4 ) As
SELECT 1, 11, 11, 11, 44 FROM DUAL UNION ALL
SELECT 2, 11, 22, 33, 44 FROM DUAL UNION ALL
SELECT 3, 11, null, 33, 33 FROM DUAL UNION ALL
SELECT 4, 11, null, null, 44 FROM DUAL;
查询 1:
SELECT *
FROM table_name
WHERE id IN (
SELECT id
FROM table_name
UNPIVOT ( value FOR key IN ( COL1, COL2, COL3, COL4 ) )
GROUP BY id, value
HAVING COUNT( DISTINCT key ) > 1
)
Results:
| ID | COL1 | COL2 | COL3 | COL4 |
|----|------|--------|------|------|
| 1 | 11 | 11 | 11 | 44 |
| 3 | 11 | (null) | 33 | 33 |
如果您想匹配NULL,那么只需使用UNPIVOT INCLUDE NULLS。
和 SQL Server,代码几乎相同(只需要在 UNPIVOT 上加上别名):
SQL Fiddle
查询 1:
SELECT *
FROM table_name
WHERE id IN (
SELECT id
FROM table_name
UNPIVOT ( value FOR name IN ( COL1, COL2, COL3, COL4 ) ) AS u
GROUP BY id, value
HAVING COUNT( DISTINCT name ) > 1
)
Results:
| ID | COL1 | COL2 | COL3 | COL4 |
|----|------|--------|------|------|
| 1 | 11 | 11 | 11 | 44 |
| 3 | 11 | (null) | 33 | 33 |
更新:
您还可以使用 Oracle 中的 *_TAB_COLUMN 字典表生成蛮力查询(SQL server 中可能有一个等效项):
SELECT 'SELECT * FROM TABLE_NAME WHERE ('
|| LISTAGG(
'"' || PRIOR COLUMN_NAME || '" = "' || COLUMN_NAME || '"',
' OR '
) WITHIN GROUP ( ORDER BY ROWNUM )
|| ')' AS query
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'TABLE_NAME'
AND COLUMN_NAME LIKE 'COL%'
AND LEVEL = 2
START WITH COLUMN_NAME LIKE 'COL%'
CONNECT BY PRIOR COLUMN_ID < COLUMN_ID;
哪些输出:
SELECT * FROM TABLE_NAME WHERE ("COL1" = "COL2" OR "COL1" = "COL3" OR "COL1" = "COL4" OR "COL2" = "COL3" OR "COL2" = "COL4" OR "COL3" = "COL4")