gpt4 book ai didi

sqlite - DBD::SQLite HAVING 子句中整数值的占位符

转载 作者:行者123 更新时间:2023-12-05 04:35:10 26 4
gpt4 key购买 nike

因为使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com