"Mr. Puneet Kishor" wrote...

>
> On Jun 19, 2011, at 10:04 PM, jose isaias cabrera wrote:
>
>> "Mr. Puneet Kishor" wrote...
>>>
>>> On Jun 19, 2011, at 5:12 PM, jose isaias cabrera wrote:
>>>
>>>>
>>>> "Nico Williams" wrote...
>>>>
>>>>> On Fri, Jun 17, 2011 at 5:05 PM, Mr. Puneet Kishor 
>>>>> <punk.k...@gmail.com>
>>>>> wrote:
>>>>>> The above is not SQL. You can't have a SQL statement begin with CASE.
>>>>>> SQL
>>>>>> statements can only begin with either SELECT or UPDATE or CREATE or
>>>>>> DELETE or ALTER, etc. CASE is an expression, and has to be a
>>>>>> replacement
>>>>>> for a column. I can't even begin to help you rewrite your statement,
>>>>>> but
>>>>>> what you are trying to accomplish is something like --
>>>>>>
>>>>>> if (some condition)
>>>>>> UPDATE this
>>>>>> else
>>>>>> UPDATE that
>>>>>>
>>>>>> Either accomplish the above in a programming language, or rewrite it 
>>>>>> as
>>>>>> separate queries, or hope Igor or someone can help you rewrite the
>>>>>> above
>>>>>> into a single query.
>>>>>
>>>>> Rewrite the statements as:
>>>>>
>>>>> INSERT ... WHERE ... AND <some condition>;
>>>>>
>>>>> Similarly for SELECT, UPDATE, and DELETE.
>>>>>
>>>>
>>>> I have rewritten the code:
>>>>
>>>> BEGIN IMMEDIATE TRANSACTION;
>>>>
>>>> UPDATE LSOpenJobs SET ProjFund = (SELECT round(sum(ProjFund) * .10,2)
>>>> FROM
>>>> LSOpenJobs
>>>> WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>> AND PSubClass != 'PM' AND PSubClass != 'Rush-Job'),
>>>> Xtra8 = (SELECT round(sum(Xtra8) * .10,2) FROM LSOpenJobs
>>>> WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>> AND PSubClass != 'PM'
>>>> AND PSubClass != 'Portal-Fee'
>>>> AND PSubClass != 'Rush-Job'),
>>>> Xtra6 = '10% of total',
>>>> XtraB = '2011-06-19 18:02:16'
>>>> WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>> AND XtraD = '10%' AND PSubClass = 'PM' AND PSubClass != 'Rush-Job';
>>>>
>>>> UPDATE LSOpenJobs SET ProjFund =
>>>>   CASE PSubClass
>>>>   WHEN 'Portal-Fee' THEN
>>>>     CASE SELECT round(sum(Xtra8),2) FROM LSOpenJobs
>>>>          WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>>                AND PSubClass != 'Portal-Fee'
>>>>     WHEN < 5000 THEN
>>>>       SELECT round(sum(ProjFund) * .0175,2) FROM LSOpenJobs
>>>>         WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>>         AND PSubClass != 'Portal-Fee'
>>>>     WHEN BETWEEN 5000 AND 20000 THEN
>>>>       SELECT round(sum(ProjFund) * .0125,2) FROM LSOpenJobs
>>>>         WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>>         AND PSubClass != 'Portal-Fee'
>>>>     ELSE
>>>>       0.0
>>>>     END
>>>>   END;
>>>> COMMIT TRANSACTION;
>>>>
>>>> This is what I get when I run that code:
>>>>
>>>> sqlite>
>>>> sqlite> BEGIN IMMEDIATE TRANSACTION;
>>>> sqlite>
>>>> sqlite> UPDATE LSOpenJobs SET ProjFund = (SELECT round(sum(ProjFund) *
>>>> .10,2) FR
>>>> OM LSOpenJobs
>>>>  ...> WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>>  ...> AND PSubClass != 'PM' AND PSubClass != 'Rush-Job'),
>>>>  ...> Xtra8 = (SELECT round(sum(Xtra8) * .10,2) FROM LSOpenJobs
>>>>  ...> WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>>  ...> AND PSubClass != 'PM'
>>>>  ...> AND PSubClass != 'Portal-Fee'
>>>>  ...> AND PSubClass != 'Rush-Job'),
>>>>  ...> Xtra6 = '10% of total',
>>>>  ...> XtraB = '2011-06-19 18:02:16'
>>>>  ...> WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>>  ...> AND XtraD = '10%' AND PSubClass = 'PM' AND PSubClass !=
>>>> 'Rush-Job';
>>>> sqlite>
>>>> sqlite>   UPDATE LSOpenJobs SET ProjFund =
>>>>  ...>     CASE PSubClass
>>>>  ...>     WHEN 'Portal-Fee' THEN
>>>>  ...>       CASE SELECT round(sum(Xtra8),2) FROM LSOpenJobs
>>>>  ...>            WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>>  ...>                  AND PSubClass != 'Portal-Fee'
>>>>  ...>       WHEN < 5000 THEN
>>>>  ...>         SELECT round(sum(ProjFund) * .0175,2) FROM LSOpenJobs
>>>>  ...>           WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>>  ...>           AND PSubClass != 'Portal-Fee'
>>>>  ...>       WHEN BETWEEN 5000 AND 20000 THEN
>>>>  ...>         SELECT round(sum(ProjFund) * .0125,2) FROM LSOpenJobs
>>>>  ...>           WHERE subProjID = 9144 AND lang = 'ES-LA'
>>>>  ...>           AND PSubClass != 'Portal-Fee'
>>>>  ...>       ELSE
>>>>  ...>         0.0
>>>>  ...>       END
>>>>  ...>     END;
>>>> Error: near "SELECT": syntax error
>>>> sqlite> COMMIT TRANSACTION;
>>>> sqlite>
>>>>
>>>
>>>
>>> Try to do the two queries separately and see which one croaks. Most 
>>> likely
>>> it is the second UPDATE query. You might need to enclose the sub-SELECTs
>>> (the ones in the CASE and WHENs) in parens. From the docs
>>
>> Your-re right, the second one "croaks".  When I use the parens, it 
>> appears
>> to work, but, I now find a new error.
>>
>> sqlite>   UPDATE LSOpenJobs SET ProjFund =
>>   ...>     CASE PSubClass
>>   ...>     WHEN 'Portal-Fee' THEN
>>   ...>       CASE (SELECT round(sum(Xtra8),2) FROM LSOpenJobs
>>   ...>            WHERE subProjID = 9144 AND lang = 'ES-LA'
>>   ...>                  AND PSubClass != 'Portal-Fee')
>>   ...>       WHEN < 5000 THEN
>>   ...>         (SELECT round(sum(ProjFund) * .0175,2) FROM LSOpenJobs
>>   ...>           WHERE subProjID = 9144 AND lang = 'ES-LA'
>>   ...>           AND PSubClass != 'Portal-Fee')
>>   ...>       WHEN BETWEEN 5000 AND 20000 THEN
>>   ...>         (SELECT round(sum(ProjFund) * .0125,2) FROM LSOpenJobs
>>   ...>           WHERE subProjID = 9144 AND lang = 'ES-LA'
>>   ...>           AND PSubClass != 'Portal-Fee' )
>>   ...>       ELSE
>>   ...>         0.0
>>   ...>       END
>>   ...>     END;
>> Error: near "<": syntax error
>>
>> Apparently, WHEN does not like < or >.  It just wants one value. It also
>> does not like BETWEEN...
>>
>> sqlite>   UPDATE LSOpenJobs SET ProjFund =
>>   ...>     CASE PSubClass
>>   ...>     WHEN 'Portal-Fee' THEN
>>   ...>       CASE (SELECT round(sum(Xtra8),2) FROM LSOpenJobs
>>   ...>            WHERE subProjID = 9144 AND lang = 'ES-LA'
>>   ...>                  AND PSubClass != 'Portal-Fee')
>>   ...>       WHEN BETWEEN 0 AND 4999.999999 THEN
>>   ...>         (SELECT round(sum(ProjFund) * .0175,2) FROM LSOpenJobs
>>   ...>           WHERE subProjID = 9144 AND lang = 'ES-LA'
>>   ...>           AND PSubClass != 'Portal-Fee')
>>   ...>       WHEN BETWEEN 5000 AND 20000 THEN
>>   ...>         (SELECT round(sum(ProjFund) * .0125,2) FROM LSOpenJobs
>>   ...>           WHERE subProjID = 9144 AND lang = 'ES-LA'
>>   ...>           AND PSubClass != 'Portal-Fee' )
>>   ...>       ELSE
>>   ...>         (0.00)
>>   ...>       END
>>   ...>     END;
>> Error: near "BETWEEN": syntax error
>>
>> How does one uses WHEN, I tried reading the site,
>>
>> http://sqlite.org/lang_expr.html
>>
>> and this is the little bit that it has:
>>
>> The CASE expression
>> A CASE expression serves a role similar to IF-THEN-ELSE in other 
>> programming
>> languages.
>> The optional expression that occurs in between the CASE keyword and the
>> first WHEN keyword is called the "base" expression.
>> ...
>> ...
>> In a CASE with a base expression, the base expression is evaluated just 
>> once
>> and the result is compared against the evaluation of each WHEN expression
>> from left to right. The result of the CASE expression is the evaluation 
>> of
>> the THEN expression that corresponds to the first WHEN expression for 
>> which
>> the comparison is true. Or, if none of the WHEN expressions evaluate to a
>> value equal to the base expression, the result of evaluating the ELSE
>> expression, if any. If there is no ELSE expression and none of the WHEN
>> expressions produce a result equal to the base expression, the overall
>> result is NULL.
>> ...
>> ...
>> The only difference between the following two CASE expressions is that 
>> the x
>> expression is evaluated exactly once in the first example but might be
>> evaluated multiple times in the second:
>> CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END
>> CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END
>> ....
>>
>> Does this means that each WHEN can only use a variable or value but not a
>> expression?  If not, then, how can I use an expression within WHEN.
>>
>> I am able to change the code to make it work to this,
>>
>>
>> BEGIN IMMEDIATE TRANSACTION;
>>
>>  UPDATE LSOpenJobs SET ProjFund =
>>    CASE PSubClass
>>    WHEN 'Portal-Fee' THEN
>>      CASE
>>      WHEN (SELECT round(sum(Xtra8),2) FROM LSOpenJobs
>>           WHERE subProjID = 9144 AND lang = 'ES-LA'
>>                 AND PSubClass != 'Portal-Fee') < 5000 THEN
>>        (SELECT round(sum(ProjFund) * .0175,2) FROM LSOpenJobs
>>          WHERE subProjID = 9144 AND lang = 'ES-LA'
>>          AND PSubClass != 'Portal-Fee')
>>      WHEN (SELECT round(sum(Xtra8),2) FROM LSOpenJobs
>>           WHERE subProjID = 9144 AND lang = 'ES-LA'
>>                 AND PSubClass != 'Portal-Fee') >= 5000 AND (SELECT
>> round(sum(Xtra8),2) FROM LSOpenJobs
>>           WHERE subProjID = 9144 AND lang = 'ES-LA'
>>                 AND PSubClass != 'Portal-Fee') < 20000 THEN
>>        (SELECT round(sum(ProjFund) * .0125,2) FROM LSOpenJobs
>>          WHERE subProjID = 9144 AND lang = 'ES-LA'
>>          AND PSubClass != 'Portal-Fee' )
>>      ELSE
>>        (0.00)
>>      END
>>    END
>>    WHERE subProjID = 9144 AND lang = 'ES-LA' AND PSubClass = 
>> 'Portal-Fee';
>> COMMIT TRANSACTION;
>>
>> But, I don't want to recalculate the SELECT for each WHEN.  I want to do 
>> it
>> just once...
>>
>
>
> Given your query, I don't think there is a way around. There are only two 
> ways CASE.. WHEN.. THEN works, and both are documented. The documentation, 
> as you yourself noted, says very clearly that, "The only difference 
> between the .. two CASE expressions is that the x expression is evaluated 
> exactly once in the first example but might be evaluated multiple times in 
> the second"
>

Thanks,  Puneet.  With the such a powerful tool SQL system, I would have 
expected the WHEN to allow an expression. Perhaps this can be thought of in 
the future. :-)

I guess I will go back to your very original suggestion, to do it within the 
programming language.

> if (some condition)
>    UPDATE this
> else
>    UPDATE that
>
> Either accomplish the above in a programming language, or rewrite it as 
> separate queries, or hope Igor or someone can help you rewrite the above 
> into a single query.
>
> Puneet.

thanks,

josé

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to