[英]The result of query mysql output "if exists" in stored procedure with "select exist" is different
我想检查此记录是否已在列表中。
我有 3 个查询:
if exists
if (select count(*) from tbl ) > 0
select exists()
但是 2 个程序的结果相同,不同于select exists
查询。
查询过程“如果存在”
CREATE DEFINER=`admin`@`localhost` PROCEDURE `ins_upd_price_cust`(IN buyerid2 VARCHAR(100),IN kdbrg VARCHAR(100),IN satuan VARCHAR(100),IN sellerid2 VARCHAR(100))
BEGIN
IF EXISTS(SELECT * FROM tblHrgCustDtl WHERE BuyerID2=buyerid2 AND KdBrg=kdbrg AND Satuan=satuan and SellerID2=sellerid2) THEN
select CONCAT("'",buyerid2,"'");
ELSE
select CONCAT("'",sellerid2,"'");
END IF;
END
查询过程 if (select count(*) from tbl ) > 0
CREATE DEFINER=`admin`@`localhost` PROCEDURE `test_proc`(IN buyerid2 VARCHAR(100),IN kdbrg VARCHAR(100),IN satuan VARCHAR(100),IN sellerid2 VARCHAR(100))
BEGIN
IF (SELECT count(*) FROM tblHrgCustDtl WHERE BuyerID2=buyerid2 AND KdBrg=kdbrg AND Satuan=satuan and SellerID2=sellerid2)>0 THEN
SELECT '1';
ELSE
SELECT '0';
END IF;
END
并查询select exists()
:
SELECT EXISTS(SELECT * FROM tblHrgCustDtl WHERE BuyerID2='10730a6aca58' AND KdBrg='A0050' AND Satuan='PCK' and SellerID2='0ec6926b09c8');
以下是表中的所有记录:
以下是表和数据结构
CREATE TABLE `tblHrgCustDtl`
(
`BuyerID2` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`Line` int NOT NULL AUTO_INCREMENT,
`KdBrg` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`Tgl` datetime NULL DEFAULT NULL,
`Qty` decimal(18, 2) NULL DEFAULT NULL,
`Satuan` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`Hrg` decimal(19, 4) NOT NULL,
`HpUnit` decimal(18, 2) NULL DEFAULT NULL,
`HpTotal` decimal(18, 2) NULL DEFAULT NULL,
`Berat` decimal(19, 4) NULL DEFAULT NULL,
`PrsDisc1` decimal(19, 4) NULL DEFAULT NULL,
`PrsDisc2` decimal(19, 4) NULL DEFAULT NULL,
`PrsDisc3` decimal(19, 4) NULL DEFAULT NULL,
`Protected` tinyint NULL DEFAULT NULL,
`HrgIncPpn` decimal(19, 4) NOT NULL,
`SellerID2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`BuyerID2`, `Line`, `SellerID2`) USING BTREE,
UNIQUE INDEX `dor`(`BuyerID2` ASC, `Line` ASC) USING BTREE,
UNIQUE INDEX `dur`(`Line` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 102776 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of tblHrgCustDtl
-- ----------------------------
INSERT INTO `tblHrgCustDtl` VALUES ('10730a6aca58', 102779, 'C011M', '2022-08-11 08:07:31', NULL, 'PCK', 0.0000, NULL, NULL, NULL, 0.0000, 0.0000, 0.0000, 0, 0.0000, '0ec6926b09c8');
INSERT INTO `tblHrgCustDtl` VALUES ('10730a6aca58', 102781, 'C011M', '2022-08-11 06:29:01', NULL, 'PCK', 116300.0000, NULL, NULL, NULL, 0.0000, 0.0000, 0.0000, 0, 129093.0000, '0ec6926b09c8');
INSERT INTO `tblHrgCustDtl` VALUES ('10730a6aca58', 102784, 'A0023', '2022-08-11 06:38:02', NULL, 'KG', 267800.0000, NULL, NULL, NULL, 0.0000, 0.0000, 0.0000, 0, 267800.0000, '0ec6926b09c8');
INSERT INTO `tblHrgCustDtl` VALUES ('10730a6aca58', 102786, 'A004M', '2022-08-11 06:43:08', NULL, 'BTL', 126818.1800, NULL, NULL, NULL, 0.0000, 0.0000, 0.0000, 0, 140768.1800, '0ec6926b09c8');
INSERT INTO `tblHrgCustDtl` VALUES ('c1fb99dd2637', 102780, 'N789M', '2022-08-11 03:30:59', NULL, 'PCK', 0.0000, NULL, NULL, NULL, 0.0000, 0.0000, 0.0000, 0, 0.0000, '0ec6926b09c8');
INSERT INTO `tblHrgCustDtl` VALUES ('c1fb99dd2637', 102782, 'C011M', '2022-08-11 06:29:01', NULL, 'PCK', 116300.0000, NULL, NULL, NULL, 0.0000, 0.0000, 0.0000, 0, 129093.0000, '0ec6926b09c8');
INSERT INTO `tblHrgCustDtl` VALUES ('c1fb99dd2637', 102785, 'A0023', '2022-08-11 06:38:02', NULL, 'KG', 267800.0000, NULL, NULL, NULL, 0.0000, 0.0000, 0.0000, 0, 267800.0000, '0ec6926b09c8');
INSERT INTO `tblHrgCustDtl` VALUES ('c1fb99dd2637', 102787, 'A004M', '2022-08-11 06:43:08', NULL, 'BTL', 126818.1800, NULL, NULL, NULL, 0.0000, 0.0000, 0.0000, 0, 140768.1800, '0ec6926b09c8');
INSERT INTO `tblHrgCustDtl` VALUES ('eb5ce263769d', 102783, 'C021M', '2022-08-11 06:33:42', NULL, 'PCK', 0.0000, NULL, NULL, NULL, 0.0000, 0.0000, 0.0000, 0, 0.0000, '0ec6926b09c8');
SET FOREIGN_KEY_CHECKS = 1;
每个查询的结果
“如果存在”
“如果(从表中选择计数(*))> 0”
“选择存在”
在我检查的列表中,没有 kdbrg=A0050。 但是 2 个程序产生不同的 output 与“选择存在”。
使用程序有什么问题吗?
您的变量名称与您的非限定列名称相同(请注意,它们都不区分大小写)。 在这种情况下,MySQL 将使用变量而不是列,请参阅局部变量 Scope 和分辨率:
局部变量不应与表列同名。 如果 SQL 语句(例如 SELECT... INTO 语句)包含对列的引用和已声明的同名局部变量,则 MySQL 当前将该引用解释为变量的名称。 [...] MySQL 将 SELECT 语句中的 xname 解释为对 xname 变量而不是 xname 列的引用。 因此,当调用过程 sp1() 时,无论 table1.xname 列的值如何,newname 变量都会返回值“bob”。
所以在
... WHERE ... AND KdBrg=kdbrg ...
和一个变量(过程参数) kdbrg='A0050'
,你实际上是在比较
... WHERE ... AND 'A0050'='A0050' ...
这是微不足道的,除非kdbrg
是null
。
只需将您的过程参数重命名为例如_kdbrg
。 从技术上讲,您还可以在列名前添加一个表限定符,例如AND tblHrgCustDtl.KdBrg = kdbrg
,但这通常被认为不太清晰和干净。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.