选择覆盖记录

时间:2015-02-10 21:23:59

标签: sql-server tsql

选择列值为NOT NULL且为NULL值的记录

这听起来像典型的SELECT * FROM表WHERE列IS NOT NULL ...但不完全

下面的表格代表了我需要处理的部分数据。



<table>
  <tr>
    <td align="center">Index</td>
    <td align="center">A</td>
    <td align="center">B</td>
    <td align="center">C</td>
  </tr>
  <tr>
    <td align="center">0</td>
    <td align="center">NULL</td>
    <td align="center">NULL</td>
    <td align="center">NULL</td>
  </tr>
  <tr>
    <td align="center">1</td>
    <td align="center">NULL</td>
    <td align="center">NULL</td>
    <td align="center">1</td>
  </tr>
  <tr>
    <td align="center">2</td>
    <td align="center">NULL</td>
    <td align="center">1</td>
    <td align="center">NULL</td>
  </tr>
  <tr>
    <td align="center">3</td>
    <td align="center">NULL</td>
    <td align="center">1</td>
    <td align="center">1</td>
  </tr>
  <tr>
    <td align="center">4</td>
    <td align="center">1</td>
    <td align="center">NULL</td>
    <td align="center">NULL</td>
  </tr>
  <tr>
    <td align="center">5</td>
    <td align="center">1</td>
    <td align="center">NULL</td>
    <td align="center">1</td>
  </tr>
  <tr>
    <td align="center">6</td>
    <td align="center">1</td>
    <td align="center">1</td>
    <td align="center">NULL</td>
  </tr>
  <tr>
    <td align="center">7</td>
    <td align="center">1</td>
    <td align="center">1</td>
    <td align="center">1</td>
  </tr>
</table>
&#13;
&#13;
&#13;

索引0记录表示如果A,B或C没有覆盖值,则每个人都会使用的默认记录

我一直在质疑A,B和B的价值观。 C但是如果没有找到,我想要NULL记录OR NULL值组合。

顺便说一下,我正在尝试使用SQL-Server 2005。

我一直在尝试像

这样的东西

SELECT * FROM Table WHERE(A = 1或A为空)或(B = 1或B为空)或(C = 1)

实际查询是4个表的交叉连接...所以值表代表我想要解决的最后部分。

如果没有匹配的话,索引0也代表结果......但是我可以让更多的那条记录返回并在php中进一步处理

1 个答案:

答案 0 :(得分:0)

假设你的where子句有意总是返回1或0条记录...... 简单地将索引0联合起来并选择前1个降序。这将始终返回1条记录,它将始终是1个匹配条件或0,除非您的where子句返回多于1条记录,在这种情况下,这将返回匹配的最高索引。

SELECT Top 1 * 
FROM (
  SELECT * 
  FROM TABLE 
  WHERE A=A AND B=B AND C=C

  UNION ALL
  SELECT * FROM TABLE WHERE INDEX=0) B
ORDER BY index desc;