2015-03-31 53 views
0

我無法瞭解以下需求。下面的示例表格。如何動態比較我的sql列

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); 

在這裏,我需要_fk列即did_fk & adid_fk比較 「ID」。 「id」應該等於did_fk &以及adid_fk。如果它們中的任何一個不是真的,那麼我應該得到那一行。在這裏我需要得到行4 & 5.因爲「_fk」列不等於「id」值。問題是「_fk」列不固定。但「id」的名字是固定的。

回答

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

謝謝Stanislav!但是這些列是動態的而不是靜態的。 – 2015-03-31 11:40:52

+0

在這種情況下,不確定您的動態含義是什麼?有沒有可能提供這些列如何定義的真實例子?謝謝! – Stan 2015-03-31 12:16:46

+0

這裏這個表只有兩個「_fk」列。我可能有更多的其他表格。我想寫一個針對數據庫的動態腳本,該腳本應該在任何表上執行以上場景。 – 2015-03-31 12:39:57

0

如果您的動態列與_fk結束或一些其他後綴可以嘗試像下面

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 

創建SP,然後調用混凝土表像

call GetNonEqualFkValues('test') 

代碼ISN不完美,但它對我有用,我認爲想法應該清楚。