我一直在尝试在我的 PDO sql 中实现 IN 语句。我已经使用 Using PDO with IN 中找到的解决方案成功实现了一个简单的解决方案
我的代码如下:
$in_array = array("INTERNAL SITE","SUPPLIER");
$in = str_repeat('?,', count($in_array) - 1) . '?';
$dbname = $_SESSION['dbname'];
$conn = new PDO("mysql:host=localhost;dbname=$dbname", $db->id, $db->pass);
//connect to db
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//error modes
$sql = "SELECT cs_id, name, alias, fk_cs_type as type, is_active as active
FROM companysite WHERE ( fk_cs_type IN ($in))";
$stmt = $conn->prepare($sql);
$stmt->execute($in_array);
但是我的最终目标是还实现引用另外 2 个变量($srchBy 和 $srchField)的 CASE 和 Like 子句。当我尝试执行此操作时,出现 HY093 错误。我在这段代码中做错了什么?
$in_array = array("INTERNAL SITE","SUPPLIER");
$in = str_repeat('?,', count($in_array) - 1) . '?';
$srchBy = "ALIAS";
$dbname = $_SESSION['dbname'];
$conn = new PDO("mysql:host=localhost;dbname=$dbname", $db->id, $db->pass);
//connect to db
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//error modes
$sql ="SELECT cs_id, name, alias, fk_cs_type as type,
is_active as active FROM companysite
WHERE ( fk_cs_type IN ($in)) AND
((CASE WHEN $srchBy = 'ALIAS' THEN alias ELSE name END)
LIKE $srchField)";
$stmt = $conn->prepare($sql);
$stmt->execute($in_array);
最佳答案
目前,您的最终 SQL 将如下所示:
SELECT
cs_id,
name,
alias,
fk_cs_type as type,
is_active as active
FROM
companysite
WHERE
( fk_cs_type IN ('INTERNAL SITE','SUPPLIER')) AND
((CASE WHEN 'ALIAS' = 'ALIAS' THEN alias ELSE name END) LIKE 'value_of_$srchField_variable')
除非您计划将语句转换为 MySQL View ,否则为什么不考虑使用 php 条件来构建更清晰、不太复杂的 SQL 语句。
$sql = "SELECT cs_id, name, alias, fk_cs_type as type, is_active as active
FROM companysite
WHERE ( fk_cs_type IN ($in) )";
if($srchBy == 'ALIAS')
{
$sql.= " AND alias LIKE $srcField";
}
else
{
$sql.= " AND name LIKE $srcField";
}
关于PHP MYSQL 在 PDO 中使用带有 CASE 和 Like 的 IN(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30996368/