【问题标题】:How to Compare my sql columns dynamically如何动态比较我的 sql 列
【发布时间】:2015-03-31 10:11:06
【问题描述】:

我无法了解以下要求。示例表如下。

CREATE TABLE `test` (
  `Id` INT NOT NULL,
  `Name` VARCHAR(45) NULL,
  `did_fk` INT NULL,
  `adid_fk` INT NULL,
  PRIMARY KEY (`Id`));

INSERT INTO test (id,name,did_fk,adid_fk) 
VALUES
(1,'Rajesh',1,1),
(2,'Neeli',2,2),
(3,'Satish',3,3),
(4,'Ganesh',4,5),
(5,'Murali',9,10);

在这里,我需要将“id”与 _fk 列进行比较,即 did_fk 和 adid_fk。 “id”应该等于did_fk & 以及adid_fk。如果其中任何一个不正确,那么我应该得到该行。这里我需要获取第 4 行和第 5 行。因为“_fk”列不等于“id”值。问题是“_fk”列不固定。但“id”名称是固定的。

【问题讨论】:

    标签: compare dynamic-columns


    【解决方案1】:
    SELECT * FROM `test` WHERE `Id` != `did_fk` OR `Id` != `adid_fk`
    

    【讨论】:

    • 谢谢斯坦尼斯拉夫!但列是动态的而不是静态的。
    • 在这种情况下不确定您所说的动态是什么意思?是否可以提供一些关于这些列如何定义的真实示例?谢谢!
    • 这里这个表只有两个“_fk”列。我可能有更多的其他表。我想针对数据库编写一个动态脚本,该脚本应该在上述场景的任何表上执行。
    【解决方案2】:

    如果您的动态列以 _fk 或其他后缀结尾,您可以尝试创建 SP,如下所示

    CREATE DEFINER=`root`@`localhost` PROCEDURE `GetNonEqualFkValues`(IN tableName varchar(255))
    BEGIN
    
    DECLARE c_name VARCHAR(255);
    DECLARE done INT DEFAULT FALSE;
    
    DECLARE curs CURSOR FOR select column_name from information_schema.columns where column_name like '%_fk';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    OPEN curs;
    SET @q = concat("SELECT * FROM ", tableName, " WHERE 1!=1 ");
    get_col: LOOP
    FETCH curs INTO c_name;
    IF done THEN 
    LEAVE get_col;
    END IF;
    
    SET @q = CONCAT(@q, " OR ", c_name," != id");
    END LOOP get_col;
    
     PREPARE stmt1 FROM @q;
      EXECUTE stmt1;
    END
    

    然后调用具体表,如

    call GetNonEqualFkValues('test')
    

    代码并不完美,但它对我有用,我认为想法应该很清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多