[英]Using concat in comparison returns everything
在一个视图中,我有一列是表的 2 列的串联(下面的 sqlfiddle 示例)。
在查询此视图 (v1) 时,我在同一视图 (v2) 上使用了子查询。 如果两个视图之间的链接是单列 (id_part_2),则行为是预期的(1 个结果)。
但是,如果链接是连接列 ('id'),而子查询本身返回单个结果,则整个查询不会应用 where 条件(返回每一行)。
http://sqlfiddle.com./#!9/6c2138/1
问题是从CONCAT
两列(没有问题,如果只用CONCAT('foo', id_part_2)
我知道可以在没有子查询的情况下编写查询,我知道CONCAT
只能在最终结果中完成。 然而,查询的编写方式并不完全在我的控制之下。 我更想知道为什么会出现这种行为,以及是否有办法避免这种行为。
旁注,我无法在我自己的数据库(在远程服务器上见证)上重现这种行为,这让我相信数据库本身是可以编辑的。
结构(在 MySQL 5.6 中):
CREATE TABLE `table_1` (
`id_part_1` varchar(255) NOT NULL,
`id_part_2` varchar(255) NOT NULL,
`search` varchar(255) NOT NULL,
PRIMARY KEY (`id_part_1`,`id_part_2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE
ALGORITHM = UNDEFINED
SQL SECURITY INVOKER
VIEW `view_1` AS
SELECT
CONCAT(`table_1`.`id_part_1`,
`table_1`.`id_part_2`) AS `id`,
`table_1`.`id_part_2` AS `id_part_2`,
`table_1`.`search` AS `search`
FROM `table_1`;
insert into table_1 values ('A', '1', 'foo1');
insert into table_1 values ('A', '2', 'foo2');
insert into table_1 values ('A', '3', 'foo3');
insert into table_1 values ('B', '4', 'foo4');
insert into table_1 values ('B', '5', 'foo5');
insert into table_1 values ('B', '6', 'foo6');
查询确定:
SELECT v1.id AS id_1
FROM view_1 v1
WHERE v1.id_part_2 IN (
SELECT v2.id_part_2
FROM view_1 v2
WHERE v2.search = 'foo2')
;
查询否:
SELECT v1.id AS id_1
FROM view_1 v1
WHERE v1.id IN (
SELECT v2.id
FROM view_1 v2
WHERE v2.search = 'foo2')
;
这只是那个版本的一个错误
在 dbfiddle,uk 这个作品见examole
还有https://www.db-fiddle.com/f/exfkgCJpH9X4ped4S2PGpj/1
CREATE TABLE `table_1` ( `id_part_1` varchar(255) NOT NULL, `id_part_2` varchar(255) NOT NULL, `search` varchar(255) NOT NULL, PRIMARY KEY (`id_part_1`,`id_part_2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE ALGORITHM = UNDEFINED SQL SECURITY INVOKER VIEW `view_1` AS SELECT CONCAT(`table_1`.`id_part_1`, `table_1`.`id_part_2`) AS `id`, `table_1`.`id_part_2` AS `id_part_2`, `table_1`.`search` AS `search` FROM `table_1`; insert into table_1 values ('A', '1', 'foo1'); insert into table_1 values ('A', '2', 'foo2'); insert into table_1 values ('A', '3', 'foo3'); insert into table_1 values ('B', '4', 'foo4'); insert into table_1 values ('B', '5', 'foo5'); insert into table_1 values ('B', '6', 'foo6');
SELECT v1.id AS id_1 FROM view_1 v1 WHERE v1.id_part_2 IN ( SELECT v2.id_part_2 FROM view_1 v2 WHERE v2.search = 'foo2') ; SELECT v1.id AS id_1 FROM view_1 v1 WHERE v1.id IN ( SELECT v2.id FROM view_1 v2 WHERE v2.search = 'foo2') ;
\n | id_1 |\n | :--- |\n | A2 |\n\n | id_1 |\n | :--- |\n | A2 |\n
db<> 在这里小提琴版本
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.