0

ヘルプが必要なクエリがあります - フォームの一部として、シリアル番号がある場合は入力されるシリアル番号フィールドがあり、シリアル番号がない場合は空白になり、シリアル番号が無効な場合は結果がありません。

select * 
from cust_site_contract as cs 
where cs.serial_no = 'C20050' or (cs.serial_no <> 'C20050' and if(cs.serial_no = 'C20050',1,0)=0)
limit 10;

通常のデータのサンプルを次に示します。

+----------------------+-----------+-----------+-----------
| idcust_site_contract | system_id | serial_no | end_date
+----------------------+-----------+-----------+-----------
|               561315 | SH001626  | C19244    | 2009-12-21
|               561316 | SH001626  | C19244    | 2010-06-30
|               561317 | SH002125  | C19671    | 2010-05-31
|               561318 | SH001766  | C14781    | 2010-09-25
|               561319 | SH001766  | C14781    | 2011-02-15
|               561320 | SH002059  | C19020    | 2008-07-09
|               561321 | SH002639  | C18889    | 2008-03-31
|               561322 | SH002639  | C18889    | 2008-06-30
|               561323 | SH002715  | C20051    | 2010-04-30
|               561324 | SH002719  | C20057    | 2010-04-30

正確な結果は次のようになります。

|               561487 | SH002837  | C20050    | 2012-07-04

これをサブクエリとして書いていたので、system_ids を顧客名と契約名に一致させることができましたが、かなり早い段階でガベージを取得していることに気付きました。3 番目のケースは当てはまらない可能性がある (つまり、無効なシリアル番号の場合、任意の顧客名の選択を許可し、データでフラグを立てるだけです) と言って単純化しようと思います。間違ってる?条件の組み合わせが明らかに間違っており、or ステートメントの両側を相互に排他的にする方法がわかりません。if(sn = 'blah') だけを評価しようとしても、明らかな理由で間違った結果が得られます。 、しかし、それを適切に表現する方法が思い浮かびません。どうもありがとうスコット

4

2 に答える 2

1

If there is is no contract with a serial number of C20050, this query will return all rows, otherwise, it will return only one row where serial_no is C20050:

SELECT a.*
FROM cust_site_contract a
INNER JOIN
(
    SELECT COUNT(*) AS rowexists
    FROM cust_site_contract
    WHERE serial_no = 'C20050'
) b ON b.rowexists = 0

UNION ALL

(
    SELECT *
    FROM cust_site_contract 
    WHERE serial_no = 'C20050'
    LIMIT 1
)
于 2012-07-09T05:06:48.870 に答える
0

以下のようにクエリを記述した場合、存在しないか、無効なシリアル番号であると空白になります。

select cs.serial_no from cust_site_contract as cs where cs.serial_no = 'C20050'
于 2012-07-09T05:03:01.100 に答える