用upper和like编写MySQL语句

时间:2014-09-21 00:44:32

标签: php mysql mysqli prepared-statement

我开始时:

$check = $db->prepare("SELECT `id`, `name` FROM `this_table` WHERE UPPER(`name`) LIKE ?")or die($db->error);

哪个不起作用,并且不返回任何行。试图进一步深入,并来到:

$check = $db->prepare("SELECT `id`, `name` FROM `this_table` WHERE UPPER(`name`) LIKE CONCAT('%', ?, '%')")or die($db->error);

但也没有快乐。在所有大写和常规套管中都尝试了我的参数。没有不同。如何将这三者结合起来?

2 个答案:

答案 0 :(得分:0)

您需要将LIKE作为包含在%:

中的变量传递
$val = '%some-value%';
$q = $db->prepare("SELECT id, name FROM this_table WHERE UPPER(name) LIKE ?" );
$q->bindValue( 1, $val );

答案 1 :(得分:0)

问:如何将这三者结合起来?

A:您的问题中没有足够的信息来了解您正在观察的行为(准备失败并显示错误消息,执行失败并显示错误消息,执行是成功的,但是fetch不会返回任何行,或者返回意外的行......我们只是在猜测。

您发布的两个SQL语句的语法似乎都是有效的。 (根据提供的信息,我们无法验证标识符,数据类型,权限等。)

我们注意到,如果使用不区分大小写的排序规则定义name列(即以_ci结尾的字符集,并且客户端字符集不区分大小写,则使用UPPER()函数可能不是必需的,但它是有效的。(我们在这里猜测name列被定义为VARCHAR列,但同样,这只是一个猜测。

为了保持一致,我们希望LIKE比较的两个方面都包含在UPPER()函数中......

SELECT t.id
     , t.name
  FROM `this_table` t
 WHERE UPPER(t.name) LIKE UPPER( ? )
       ^^^^^              ^^^^^

如果您希望使用通配符匹配,则name值为' abcd'将匹配''然后您需要在bindParam中提供的值包含通配符。

如果您提供的价值仅为'bc',那么您可以包含第二个示例中显示的外卡字符,其中包含CONCAT函数和文字{{1} } characters。

'%'

除此之外,我们只会根据您提供的信息猜测您所观察到的行为。