SQLITE3复合“选择”语句

时间:2012-01-02 03:41:15

标签: sql select sqlite simplify

我有一个包含多个列的表。第1列和第2列可以包含四个alpha值中的任何一个:set = {A,B,C,D}。

我想检查每列是否包含该组中的两个值中的任何一个。所以我想简化这个陈述:

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

有没有办法简化这个陈述。随着我添加更多列,将会有更多的突变需要检查。我可以看到SQL语句变长/重复。

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

答案 2 :(得分:0)

所有其他条件相同,我想我会修改数据库结构以消除多列。虽然我知道这可能是一些预先工作,但它将极大地降低SQL的复杂性。您已经在考虑为其他突变添加更多列的事实只会强化我的想法,即这是正确的方向。

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

新表 - 现有突变 patientID - PK mutationType - char

然后SQL变为

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

我希望这会有所帮助。