查询 1。
我尝试使用 PHP 运行它:
<?php
$pdo = new \PDO('pgsql:host=localhost;dbname=postgres', 'postgres', 'postgres');
$sql = <<<SQL
SELECT *
FROM (
SELECT 'CHAC TECHNOLOG*' as alias
UNION
SELECT 'KINDERY LIGHTING SALES DE?T*'
) m
JOIN (
SELECT 'CHACTECHNOLOGICO\\' as ie_clean
UNION
SELECT 'KINDERYLIGHTINGSALESDEPT' as ie_clean
) t ON t.ie_clean ILIKE REPLACE(REPLACE(REPLACE(m.alias, '*', '%'), '?', '_'), ' ', '')
ORDER BY ie_clean;
SQL;
echo $sql . PHP_EOL . PHP_EOL;
$stmt = $pdo->query($sql);
print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
我有下一个输出:
SELECT *
FROM (
SELECT 'CHAC TECHNOLOG*' as alias
UNION
SELECT 'KINDERY LIGHTING SALES DE?T*'
) m
JOIN (
SELECT 'CHACTECHNOLOGICO\' as ie_clean
UNION
SELECT 'KINDERYLIGHTINGSALESDEPT' as ie_clean
) t ON t.ie_clean ILIKE REPLACE(REPLACE(REPLACE(m.alias, '*', '%'), '?', '_'), ' ', '')
ORDER BY ie_clean;
Array
(
[0] => Array
(
[alias] => CHAC TECHNOLOG*
[ie_clean] => CHACTECHNOLOGICO\
)
)
只有一个记录(这是错误的)。
但是当我尝试直接在 PostgreSQL 中运行它时,这个查询返回了两条记录。是正确的结果。
https://www.db-fiddle.com/f/qNZY5SauB87na2pWf8uwxm/0
查询 2。
这是类似的查询,但现在我将部分条件从部分WHERE移至SELECT部分:
<?php
$pdo = new \PDO('pgsql:host=localhost;dbname=postgres', 'postgres', 'postgres');
$sql = <<<SQL
SELECT *
FROM (
SELECT REPLACE(REPLACE(REPLACE('CHAC TECHNOLOG*', '*', '%'), '?', '_'), ' ', '') as alias
UNION
SELECT REPLACE(REPLACE(REPLACE('KINDERY LIGHTING SALES DE?T*', '*', '%'), '?', '_'), ' ', '')
) m
JOIN (
SELECT 'CHACTECHNOLOGICO\\' as ie_clean
UNION
SELECT 'KINDERYLIGHTINGSALESDEPT' as ie_clean
) t ON t.ie_clean ILIKE m.alias
ORDER BY ie_clean;
SQL;
echo $sql . PHP_EOL . PHP_EOL;
$stmt = $pdo->query($sql);
print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
输出是:
SELECT *
FROM (
SELECT REPLACE(REPLACE(REPLACE('CHAC TECHNOLOG*', '*', '%'), '?', '_'), ' ', '') as alias
UNION
SELECT REPLACE(REPLACE(REPLACE('KINDERY LIGHTING SALES DE?T*', '*', '%'), '?', '_'), ' ', '')
) m
JOIN (
SELECT 'CHACTECHNOLOGICO\' as ie_clean
UNION
SELECT 'KINDERYLIGHTINGSALESDEPT' as ie_clean
) t ON t.ie_clean ILIKE m.alias
ORDER BY ie_clean;
Array
(
[0] => Array
(
[alias] => CHACTECHNOLOG%
[ie_clean] => CHACTECHNOLOGICO\
)
[1] => Array
(
[alias] => KINDERYLIGHTINGSALESDE_T%
[ie_clean] => KINDERYLIGHTINGSALESDEPT
)
)
两个记录!是正确的结果。
Postgres 也返回两条记录(它是正确的):
https://www.db-fiddle.com/f/nSv1Tg9YJMgfUUhn7urFyF/0
问题
我认为问题出在 中的尾部斜线'CHACTECHNOLOGICO\\',但我重新检查了它,并且我认为它是正确的。
为什么查询 1 从 PHP 中只返回一条记录。是 PDO 的错误还是我做错了什么?
UPD
