如何动态比较我的sql列

时间:2015-03-31 10:11:07

标签: compare dynamic-columns

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

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行和第4行。 5.Since" _fk"列不等于" id" value.Problem是" _fk"列不固定。但是" id"名称是固定的。

2 个答案:

答案 0 :(得分:0)

SELECT * FROM `test` WHERE `Id` != `did_fk` OR `Id` != `adid_fk`

答案 1 :(得分:0)

如果您的动态列以_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')

代码并不完美,但它适用于我,我认为理念应该是明确的。