IN
これには述語を使用できません。これは、とのIN
比較方法のみを知って=
おり、NULL を処理するために別の方法で比較する必要があるためです。
MySQL には、 NULL=NULL が true であり、NULL = 'RED' が false であることを認識している、非標準のヌル セーフ等価演算子があります。<=>
MySQL 以外のものを使用する場合、RDBMS はIS [NOT] DISTINCT
同様の述語の標準 SQL 構文をサポートしている可能性があります。
私は以下をテストしましたが、動作します:
$arr = array('C050101','RED', 'C070104', NULL);
$sql = "SELECT `id`, `WebTitle`, `StockCode` FROM `stock`
WHERE (`StockCode`, `StockVariant`) <=> (?, ?)
OR (`StockCode`, `StockVariant`) <=> (?, ?)";
$stockstmt = $pdo->prepare($sql);
if ($stockstmt === false) { die(print_r($pdo->errorInfo(), true)); }
$status = $stockstmt->execute($arr);
if ($status === false) { die(print_r($stockstmt->errorInfo(), true)); }
述語のリストをどのように作成するかは、あなたに任せます。
あなたのコメントについて:
リテラル文字列 'NULL' を使用して、欠落している値や適用できない値を表すことはお勧めできません。これが、SQL における NULL の目的です。
述語の構築をより動的にする関数が必要な場合は、これを試してください。
function lookformultiplethings(array $arr)
{
global $pdo;
$where = array();
$values = array();
foreach ((array) $arr as $term) {
$where[] = '('
. join(',', array_map(function ($col) {return "`$col`";}, array_keys($term)))
. ') <=> ('
. join(',', array_fill(0,count($term),'?'))
. ')';
$values = array_merge($values, array_values($term));
}
$sql = "SELECT `id`, `WebTitle`, `StockCode` FROM `stock` ";
if ($where) {
$sql .= "WHERE " . join(' OR ', $where);
}
$stockstmt = $pdo->prepare($sql);
if ($stockstmt === false) { die(print_r($pdo->errorInfo(), true)); }
$status = $stockstmt->execute($values);
if ($status === false) { die(print_r($stockstmt->errorInfo(), true)); }
print_r($stockstmt->fetchAll());
}
lookformultiplethings(array(
array('StockCode' => 'C050101', 'StockVariant' => 'RED'),
array('StockCode' => 'C070104', 'StockVariant' => 'NULL'),
));
渡す配列のキーが正当な列名であることに注意してください。つまり、実際の列のホワイトリストと照らし合わせて検証しない限り、ユーザー入力によって列名が設定されないようにしてください。