作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因为使用 DBD::mysql 的类似语句似乎工作正常,当使用 DBD::SQLite 时,我在 HAVING
子句中使用整数占位符的错误在哪里?作为 DBI 驱动程序?
#!/usr/bin/perl
use 5.012;
use warnings;
use DBI;
my $dbh = DBI->connect("dbi:SQLite:dbname=/tmp/test.sqlite","","", {
RaiseError => 1,
sqlite_allow_multiple_statements => 1,
});
$dbh->do( <<'EOT' );
CREATE TABLE cd (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT
);
CREATE TABLE artist (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
cd INTEGER,
FOREIGN KEY (cd) REFERENCES cd (id)
);
INSERT INTO cd (title) VALUES ('foo');
INSERT INTO cd (title) VALUES ('bar');
INSERT INTO artist (name, cd) VALUES ('max fob', 1);
INSERT INTO artist (name, cd) VALUES ('max baz', 1);
EOT
my $sth1 = $dbh->prepare(<<'EOT');
SELECT cd.title
FROM cd
LEFT JOIN artist ON artist.cd = cd.id
WHERE artist.name LIKE ?
GROUP BY cd.title
HAVING count( artist.cd ) = 2
EOT
my $sth2 = $dbh->prepare(<<'EOT');
SELECT cd.title
FROM cd
LEFT JOIN artist ON artist.cd = cd.id
WHERE artist.name LIKE ?
GROUP BY cd.title
HAVING count( artist.cd ) = ?
EOT
$sth1->execute('max%');
# says 'hit'
say 'sth1: hit' if $sth1->fetch;
$sth2->execute('max%', 2);
# stays silent
say 'sth2: hit' if $sth2->fetch;
谢谢你,DDL。
最佳答案
A ?
占位符总是在准备好的语句中替换为字符串(如 '2'
),这对于 SQLite 而言没有亲和性 .
来自 Datatypes In SQLite/Affinity Of Expressions派生出像 count(artist.cd)
这样的表达式,虽然它返回一个整数,但没有亲和性。
此外,来自 Datatypes In SQLite/Type Conversions Prior To Comparison推导出两个没有亲和性的操作数在没有任何隐式数据类型转换的情况下进行比较。
对于 SQLite,表达式 2 = '2'
返回 false
。
这就是为什么您必须对 ?
占位符应用数据类型转换以将其转换为数值,您可以这样做:
HAVING count( artist.cd ) = ? + 0
此外,与您的问题无关,查询中的 WHERE
子句使 LEFT
连接的行为类似于 INNER
连接,因为它应用于右表的列并过滤掉任何不匹配的行。
关于sqlite - DBD::SQLite HAVING 子句中整数值的占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71066691/
我是一名优秀的程序员,十分优秀!