2017-12-01 6 views
0

私のテーブルには、いくつかのdocNumシリーズがあります。パラメータを使用してレコードを取り出す方法は?

すべてのシリーズを条件付きで取得するか、セットから1つのシリーズを除外したいと考えています。

私は正しいクエリがどうあるべきか

declare @p char(1) = 1 

select 
    t0.docNum 
from 
    OINV t0 
where 
    t0.DocNum = case 
        when @p <> '1' then t0.DocNum        
        else (select t1.DocNum 
         from oinv t1 
         where SUBSTRING(convert(varchar, t1.docNum), 1, 1) <> '9' 
          and LEN(convert(varchar, t1.docNum)) < 7) 
       end 

をエラーを返し、次のクエリを試してみましたか?

+1

どういうところでしたか? – zambonee

+1

ここにはいくつかの問題があります。まず、文字列リテラルを '1'で定義する必要があります。その後、varcharに変換していますが、長さは指定しません。長さにはデフォルト値があり、用途に応じて変更されます。明示してください。そして、これは少し複雑になりますが、実際に何が起こっているのかは分かりません。エラーが出ているというだけでなく、エラーメッセージを投稿した場合に役立ちます。 –

+0

SQLの学習を始めたばかりのときには、完全なクエリを何度も間違えて書くのではなく、すべての文に対してクエリを実行することをお勧めします。私はそれが最初の行で失敗することがわかります。 – Eric

答えて

1

2つ以上の行を返すサブクエリに関するエラーメッセージが表示されていることを確認してください。これは、副問合せが表からすべての行を戻すためです。これを避けるには、そのサブクエリを外部クエリに関連付ける必要があります。しかし、ここではサブクエリを使用する必要はありません。これは、このようなものに単純化することができます。

declare @p char(1) = '1' 

select o.docNum 
from OINV o 
where @p <> '1' 
OR 
(
    SUBSTRING(convert(varchar(10/*whatever size is appropriate*/), o.docNum), 1, 1) <> '9' 
    and 
    LEN(convert(varchar(10/*whatever size is appropriate*/), o.docNum) ) < 7 
) 
関連する問題