2012-07-20 45 views
2

我需要一种方法来定义一个变量来保存在MYSQL中的表达式的结果,以便我可以在整个查询中使用该变量。
所以这是可能的:需要的方法来完成这个SQL查询

SELECT 
IF(VALID,EMPLOYEE_NAME,"NULL") AS NAME, /** <-- Note *VALID* 
IF(VALID,ID,"NULL") AS ID, /** <-- And here... 
IF(VALID,OCCUPATION,"NULL") AS OCCUPATION, /** <-- And here... 

IF((**LONG EXPRESSION**), TRUE, FALSE) AS VALID; /** <-- Taken from here 

其中长表达式可以非常隆表达,我需要把在IF语句返回的每个列,还有很多国际单项体育联合会。

我的直觉告诉我,我应该能够做到这一点就像每个程序语言:

$var = LONG_EXPRESSION(....); 
if($var) {..}; 
if($var) {..}; 
if($var) {..}; 
if($var) {..}; 

这样,它是很多更符合逻辑且不易出错。易于维护,易读,甚至可能优化。

MYSQL里面有这个等价物吗?
因此,为每一行执行定义一个参数?

+0

我理解正确吗?如果它是有效的,那么你需要一个值或NULL,否则结果中的每个字段? – Sujay 2012-07-20 01:07:39

+0

所以,你想为结果中的所有'VALID'条目获得'NAME,ID,OCCUPATION,ETC.',其中一些复杂的逻辑给'VALID'赋'TRUE'或'FALSE'为'TRUE'?是对的吗?你正在描述一个'WHERE'子句。 – 2012-07-20 01:12:38

+0

我需要一个零或NULL,并为结果的工作位置值。 WHERE不会返回VALUE为false的行,对吗? – Ted 2012-07-20 07:53:54

回答

1

你只需要一个子查询:

SELECT IF(VALID,EMPLOYEE_NAME,"NULL") AS NAME, /** <-- Note *VALID* 
     IF(VALID,ID,"NULL") AS ID, /** <-- And here... 
     IF(VALID,OCCUPATION,"NULL") AS OCCUPATION, 
     ..., 
     VALID 
from (select t.*, IF((**LONG EXPRESSION**), TRUE, FALSE) AS VALID 
     from t 
    ) t 
+0

这个工作吗?即使有WHERE条款,它有什么好处?对于任何'inVALID'表达式结果,所有字段都是'“NULL”,所以......? – 2012-07-20 02:41:56

+0

你应该问这个问题的人写这个问题。我无法证明这个人需要什么。 – 2012-07-20 02:55:40

+0

我的第一个问题是,“它会起作用吗”;我对此表示怀疑,“有效”甚至可以在实地清单中发挥作用。除此之外:有人建议做某件事并不意味着它应该以这种方式完成,或者它可以工作。我感觉OP有一些误解,我已经在评论中注意到了。 – 2012-07-20 03:02:19

0

可能是一个更合适的方式来做到这一点是做原始表和子查询之间的OUTER JOIN含长表达WHERE条款。

SELECT IF(b.rowid IS NULL, "NULL", a.employee_name) AS name, 
     IF(b.rowid IS NULL, "NULL", a.id) AS id, 
     IF(b.rowid IS NULL, "NULL", a.occupation) AS occupation, 
     ..., 
     IF(b.rowid IS NULL, 0, 1) AS valid 
FROM mytable a 
LEFT OUTER JOIN 
(SELECT rowid FROM mytable 
WHERE **LONG EXPRESSION**) b 
ON a.rowid = b.rowid 

此处假定rowid是表格中的唯一键列。