SQL如何选择存在多种条件之一的所有内容

时间:2014-08-14 14:41:26

标签: sql if-statement case conditional-statements where-clause

首先感谢您的帮助!我的问题是......如何创建一个SQL SELECT语句来选择存在某些条件/情况的所有内容。见下面的例子:

我希望SQL语句选择给定表中的所有内容WHERE $ userID(类型为INT的PHP变量)满足4个条件/案例中的任何一个

4个条件中的每一个: type1_id type2_id type3_id type4_id 都是同桌。

如果说每个类型都放在不同的表格中,可以自由地描述如何做到这一点。

SELECT * 
FROM table_name 
WHERE 
    if(type1_id > 0) 
    {
        type1_id = '$userID' 
    }
    elseif (type2_id > 0)
    {
        type2_id = '$userID'
    }
    elseif (type3_id > 0)
    {
        type3_id = '$userID'
    }
    elseif (type4_id > 0)
    {
        type4_id = '$userID'
    }

5 个答案:

答案 0 :(得分:2)

尝试:

WHERE (type1_id > 0 AND type1_id = '$user_id')
OR    (type2_id > 0 AND type2_id = '$user_id')
OR    (type3_id > 0 AND type3_id ...

查看表格数据的选择会很有帮助,但这样可以确保满足这两个条件,但仍允许您检查多个“条件”。

答案 1 :(得分:2)

我更喜欢使用IN。

SELECT * 
FROM table_name 
WHERE '$UserID' IN (type1_id,type2_id,type3_id,type4_id)

答案 2 :(得分:1)

通常,使用OR语句。

WHERE < one boolean statement > 
OR    < another boolean statement > 

特别是对于你想要的东西,因为每个OR的内部看起来都一样,你可以使用CASE语句,如下所示:

where '$userID' = case when type1_id > 0 then type1_id
                       when type2_id > 0 then type2_id
                       ... 
                   end

当然,如果您不需要检查typeX_id > 0那么@Apothosis建议,使用IN是迄今为止最好的方法!

答案 3 :(得分:0)

select *
from tablename
where type1_id > 0 and type1_id = '$userID' 
   or type2_id > 0 and type2_id = '$userID' 
   or type3_id > 0 and type3_id = '$userID' 
   or type4_id > 0 and type4_id = '$userID' 

是非常必要的elseif,或者总是只有一个typeN_id是&gt; 0?

如果elseif很重要:

select *
from tablename
where type1_id > 0 and type1_id = '$userID' 
   or type1_id <=0 and type2_id > 0 and type2_id = '$userID' 
   or type1_id <= 0 and type2_id <= 0 and type3_id > 0 and type3_id = '$userID' 
   or type1_id <= 0 and type2_id <= 0 and type3_id <= 0 and type4_id > 0 and type4_id = '$userID' 

如果记录为所有typeN_id列的0值,会发生什么?在你的逻辑中,它将在结果中。

答案 4 :(得分:0)

很快就会提出一些建议,但首先是对您的问题的最直接和最直接的答案:

SELECT * 
FROM table_name 
WHERE 
  (type1_id > 0 and type1_id = '$userID')
OR
  (type2_id > 0 and type2_id = '$userID')
OR
  (type3_id > 0 and type3_id = '$userID')
OR
  (type4_id > 0 and type4_id = '$userID')

现在,有一些问题:

  1. 将$ userID直接连接到SQL中有几个风险:
    • SQL注入
    • 每次重新查询
  2. 将每列以数字形式比较为>0,然后等于字符串感觉很腥。这是什么数据类型?我想知道> 0是否多余。如果它们不是真正需要的话,如果可以避免嵌套的AND / OR组合,它可能使您的查询更容易维护并具有更可靠的执行计划。但只有它们实际上是多余的。
  3. 通过将整数与该数字的字符串表示形式进行比较来进行隐式类型转换/转换。这将导致额外的CPU周期,并可能阻止索引搜索。