1

我有一张有几列的桌子。第 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 语句变长/重复。

4

3 回答 3

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)

就数据库而言,查询应该是相同的,但这个版本可能更具可读性。

于 2012-01-02T04:03:11.137 回答
1

您可以inwhere子句中使用 a,而不是直接进行相等检查。例子:

SELECT
    *
FROM
    mytable
WHERE
    col1 IN ("A", "B")
    OR col2 IN ("A", "B")
    OR col3 IN ("A", "B")
于 2012-01-02T03:56:17.023 回答
0

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

示例 - 假设您现有的主键是患者 ID。

新表 - 现有突变患者 ID - PK 突变类型 - 字符

然后 SQL 变为

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

我希望这有帮助。

于 2012-01-02T04:00:35.180 回答