2013-06-11 3 views
2

У меня есть таблица со столбцом a, b, expr, которая expr является выражением из другого столбца. , например, таблица содержитоценивать выражение в MySQL

a b expr 
------------ 
2 5 a+b 
3 4 a*b+3 

Мне нравится просто выполнить запрос и получить протекающий результат:

a | b | expr 
------------ 
2 | 5 | 7 
3 | 4 | 15 

Я ищу документ для функции, процедуры и т.д., но я не могу это сделать. , пожалуйста, помогите мне!

+1

Вы хотите достичь этого при запросе данных? Или когда вы вставляете данные –

+0

, я не думаю, что это возможно только на одном уровне. Возможно, какая-то хранимая процедура сделает это возможным. Я бы посоветовал переместить эту абстракцию на язык программирования. – cb0

+0

[duplicate] (http://stackoverflow.com/questions/6805498/create-table-in-mysql-with-one-column-containg-sum-of-another-two-columns-value) –

ответ

0

Если я правильно понял ваш вопрос, это то, что вы ищете:

SELECT a, b, (a+b) AS expr FROM yourtable; 
+0

нет, это не то, что я хочу. expr различаются по строкам, например, следующая строка expr = a * b + 3 –

+0

Я думаю, что это то, что он хочет, за исключением того, что выражение может быть переменной. например expr = "(a% b)" или expr = "(a * b)" – cb0

+0

@saied Arianpour: Вы должны объяснить это более четко в своем вопросе. Мы не понимаем, что вам нужно другое выражение для каждой строки. –

2

Вот решение, которое я сделал для удовольствия. Подумайте об этом с помощью реального языка программирования, если это не одно время.

drop table if exists Table1; 
CREATE TABLE Table1 
    (`a` int, `b` int, `expr` varchar(6)) 
; 

INSERT INTO Table1 
    (`a`, `b`, `expr`) 
VALUES 
    (2, 5, 'a+b'), 
    (3, 4, 'a*b +3') 
; 

drop table if exists Table2; 
CREATE TABLE Table2 
    (`a` int, `b` int, `expr` int) 
; 

drop procedure if exists curdemo; 
DELIMITER $$ 
CREATE PROCEDURE curdemo() 
BEGIN 
    DECLARE done INT DEFAULT 0; 
    DECLARE seqel VARCHAR(255); 
    DECLARE cur1 CURSOR FOR SELECT CONCAT('INSERT INTO Table2 (a, b, expr) SELECT a, b, ' , expr, ' FROM (SELECT ', a, ' as a, ', b, ' as b) sq;') FROM Table1; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 

    OPEN cur1; 

    REPEAT 
    FETCH cur1 INTO seqel; 
    IF NOT done THEN 
     SET @sql:=seqel; 
     PREPARE stmt FROM @sql; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
    END IF; 
    UNTIL done END REPEAT; 

    CLOSE cur1; 
END $$ 
DELIMITER ; 

CALL curdemo(); 

SELECT * FROM Table2; 
+0

@saeidArianpour Любая обратная связь? – fancyPants

+0

спасибо @tombom, ваше решение сработало! но это не просто, и я не могу его использовать. –

+0

Почему вы не можете его использовать? – fancyPants

Смежные вопросы