0

我有一个包含 5 列 ( A1,A2,A3,A4,A5) 的数据库,其中存储 5 个数字。

5个数字是"1,2,3,4,5"

A1     A2     A3     A4     A5
-------------------------------
2      4      5      Null  Null

我想得到缺失的数字“1”和“3”。如何从 5 个号码中找到丢失的号码?

4

4 回答 4

2
Select Replace(Replace(Replace(Replace(
Replace('12345',(Cast(Coalesce(A5,0) as varchar(1))),''),
(Cast(Coalesce(A4,0) as varchar(1))),''),
(Cast(Coalesce(A3,0) as varchar(1))),''),
(Cast(Coalesce(A2,0) as varchar(1))),''),
(Cast(Coalesce(A1,0) as varchar(1))),'') from Table1

Sql 小提琴演示

于 2013-09-18T04:26:30.690 回答
2

你可以这样做

WITH sequence AS
(
  SELECT 1 n UNION ALL
  SELECT n + 1 FROM sequence WHERE n < 5
)
SELECT n
  FROM sequence s LEFT JOIN table1 t
    ON s.n IN (t.a1, t.a2, t.a3, t.a4, t.a5)
 WHERE t.a1 IS NULL

输出:

| N |
|---|
| 1 |
| 3 |

这是SQLFiddle演示

于 2013-09-18T04:50:54.763 回答
1

根据所需的输出,这可能会起作用。这将返回每行的相关缺失数字。

    SELECT CASE WHEN COALESCE(A1,0)<>1 AND COALESCE(A2,0)<>1 AND COALESCE(A3,0)<>1 
            AND COALESCE(A4,0)<>1 AND COALESCE(A5,0)<>1 THEN 1 ELSE '' END A
        , CASE WHEN COALESCE(A1,0)<>2 AND COALESCE(A2,0)<>2 AND COALESCE(A3,0)<>2 
            AND COALESCE(A4,0)<>2 AND COALESCE(A5,0)<>2 THEN 2 ELSE '' END B
        , CASE WHEN COALESCE(A1,0)<>3 AND COALESCE(A2,0)<>3 AND COALESCE(A3,0)<>3 
            AND COALESCE(A4,0)<>3 AND COALESCE(A5,0)<>3 THEN 3 ELSE '' END C
        , CASE WHEN COALESCE(A1,0)<>4 AND COALESCE(A2,0)<>4 AND COALESCE(A3,0)<>4 
            AND COALESCE(A4,0)<>4 AND COALESCE(A5,0)<>4 THEN 4 ELSE '' END D
        , CASE WHEN COALESCE(A1,0)<>5 AND COALESCE(A2,0)<>5 AND COALESCE(A3,0)<>5 
            AND COALESCE(A4,0)<>5 AND COALESCE(A5,0)<>5 THEN 5 ELSE '' END E
    FROM NumTest 
    WHERE COALESCE(A1,0)+COALESCE(A2,0)+COALESCE(A3,0)+COALESCE(A4,0)+COALESCE(A5,0)<>15

结果如下所示:

在此处输入图像描述

于 2013-09-18T04:35:28.627 回答
0

您需要一个从 1 到(在本例中)5 的整数表:

DECLARE @ints table (n int);
INSERT @ints VALUES (1), (2), (3), (4), (5);

其次,我们将表格行中的数字放入一个可比较的集合中:

SELECT x INTO #all FROM (
    SELECT A1 as x FROM myTable WHERE ID = myRow
    UNION ALL
    SELECT A2 as x FROM myTable WHERE ID = myRow
    UNION ALL
    SELECT A3 as x FROM myTable WHERE ID = myRow
    UNION ALL
    SELECT A4 as x FROM myTable WHERE ID = myRow
    UNION ALL
    SELECT A5 as x FROM myTable WHERE ID = myRow
    ) y

那么你可以得出答案:

SELECT @ints.n
FROM @ints left join #all on @ints.n = #all.x
WHERE #all.x is null
ORDER BY 1
于 2013-09-18T04:27:15.390 回答