繁体   English   中英

存储过程中查询mysql output“如果存在”与“选择存在”的结果不同

[英]The result of query mysql output "if exists" in stored procedure with "select exist" is different

我想检查此记录是否已在列表中。

我有 3 个查询:

  • 1 程序( if exists
  • 1 个过程if (select count(*) from tbl ) > 0
  • 1 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' ...

这是微不足道的,除非kdbrgnull

只需将您的过程参数重命名为例如_kdbrg 从技术上讲,您还可以在列名前添加一个表限定符,例如AND tblHrgCustDtl.KdBrg = kdbrg ,但这通常被认为不太清晰和干净。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM