2012-01-02 179 views
1

我有一个有几列的表。第1列和第2列可以包含四个alpha值中的任何一个:set = {A,B,C,D}。SQLITE3复合“选择”语句

我想检查每列是否包含这两个值中的任何一个。所以,我希望能够简化这一说法:

SELECT * FROM MUTATION-TABLE WHERE (COLUMN1 = "A") OR (COLUMN2 = "A") OR (COLUMN3 = "A") 
OR (COLUMN1 = "B") OR (COLUMN2 = "B") OR (COLUMN3 = "B"). 

有没有一种方法来简化这一说法。随着我添加更多列,将会有更多突变进行检查。我可以看到SQL语句变长/重复。

回答

3

如果你只有两个值,但很多列,然后切换到IN和一组列的检查你的常数值:

SELECT * 
FROM "MUTATION-TABLE" 
WHERE 'A' IN (COLUMN1, COLUMN2, COLUMN3) 
    OR 'B' IN (COLUMN1, COLUMN2, COLUMN3) 

并与多个列:

SELECT * 
FROM "MUTATION-TABLE" 
WHERE 'A' IN (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5) 
    OR 'B' IN (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5) 

查询应该与数据库相同,但该版本可能更具可读性。

1

您可以在where子句中使用in而不是直接相等性检查。例如:

SELECT 
    * 
FROM 
    mytable 
WHERE 
    col1 IN ("A", "B") 
    OR col2 IN ("A", "B") 
    OR col3 IN ("A", "B") 
0

所有其他的事情都是平等的,我想我会修改数据库结构以消除多列。虽然我知道这可能是一个预先工作,但它会显着降低SQL的复杂性。事实上,你已经在考虑增加更多的列来增加突变,这只会加强我的想法,即这是正确的方向。

示例 - 假定您的现有主键是patientID。

新表 - 现有的突变 patientID - PK mutationType - 炭

的SQL就变成

SELECT * 
FROM MUTATION-TABLE 
WHERE patientID IN (SELECT patienID 
        FROM existing-mutations 
        WHERE mutationType = "A") 

我希望这有助于。