在SQL中匹配任何字符串的方法

时间:2009-12-07 17:38:19

标签: sql string-matching

我有一个简单的SQL查询,

SELECT * FROM phones WHERE manu='$manuf' AND price BETWEEN $min AND $max

问题是所有变量字段都连接到有时为空的字段,因此我需要一种方法使它们匹配各自字段可以采用的任何值(如果它们为空)。我试过了

$min=$_REQUEST['min_price'];
$max=$_REQUEST['max_price'];
$manuf=$_REQUEST['manufact'];
if (empty($min)){
    $min=0;}
if (empty($max)){   
    $max=900000;}
if (empty($manuf)){
    $manuf='*';}

适用于数字字段(虽然我不喜欢像这样手动设置限制),但我无法弄清楚如何获得文本字段的通用匹配。我认为*会这样做,因为它匹配所有行名称,但显然不是。有谁知道怎么做?

4 个答案:

答案 0 :(得分:1)

我猜你想让它成为一个“过滤”类型的查询,允许参数是可选的?你可以这样做:

SELECT 
    * 
FROM 
    Phones 
WHERE
    (manu = $manu OR manu IS NULL)
    AND (min = $min OR min IS NULL)
    AND (max = $max OR max IS NULL)

使用null选项添加OR(可以使其为空字符串或其他)允许您对传递的任何参数进行过滤。

您可以将它与上面的内容结合起来,检查最小/最大值并为BETWEEN子句提供默认值。

答案 1 :(得分:1)

如果我是你,我会将整个SQL分成几部分,并处理WHERE语句。

某些人喜欢:

sql = "SELECT * FROM phones WHERE 1=1 "
if (not empty($manu))
    sql = sql + ' AND manu = "$manu"'
...

问候。

答案 2 :(得分:1)

我倾向于通过更改SQL中的逻辑并传入NULL参数或具有特定值的参数来实现此目的。

WHERE manu='$manuf' AND price BETWEEN $min AND $max

=>

WHERE
    (manu='$manuf' OR '$manuf' = '*')    -- Check for "special value"
    AND (price >= $min OR $min IS NULL)  -- Check for NULL
    AND (price <= $max OR $max IS NULL)  -- Check for NULL

答案 3 :(得分:0)

也许像......

SELECT * FROM phones 
WHERE manu = coalesce(?, manu)
AND price >= coalesce(?, price) 
AND price <= coalesce(?, price)

然后传入参数而不是直接输入变量(不知道如何在PHP中做到这一点)。