web-dev-qa-db-ja.com

IN内でワイルドカードを使用するSQL Server

これは基本的な質問であるべきだと思うので、この質問はおそらく尋ねられたと思いますが、見つけることができません。おそらくピアプレッシャーバッジを獲得しようとしていますが、とにかく質問します。

INを使用するときにワイルドカード文字%を使用することをSQL Serverで認識していない方法はありますか。

私はORのようなものを使用できることを理解しています:

select *
from jobdetails
where job_no like '0711%' or job_no like '0712%'

場合によっては、次のようなサブクエリを使用できます。

select *
from jobdetails
where job_no in (select job_no from jobs where job_id = 39)

しかし、私は次のようなことをしたいと考えています:

select *
from jobdetails
where job_no in ('0711%', '0712%')

この場合、ワイルドカード文字ではなくパーセント記号を文字として使用するため、行は返されません。現在、私はこれをしなければならないときに、たくさんのORを使用していますが、もっと良い方法が必要だと思います。これにはどのような方法を使用しますか?

37
Dusty

どうですか:

WHERE LEFT(job_no, 4) IN ('0711', '0712', ...)
24
Aaron Alton

私は、この調査の発信者が単純な形で望んでいたことに対する解決策があると思います。それは私のために働いており、実際それは私が最初にここに来た理由です。 '%text%'のような列をカッコで囲んでORsと組み合わせて使用​​すると思います。

select * from tableName
where (sameColumnName like '%findThis%' or sameColumnName like '%andThis%' or 
sameColumnName like '%thisToo%' or sameColumnName like '%andOneMore%') 
10
notYetExpert

このようなものはどうですか?

declare @search table
(
    searchString varchar(10)
)

-- add whatever criteria you want...
insert into @search select '0711%' union select '0712%'

select j.*
from jobdetails j
    join @search s on j.job_no like s.searchString
10
GalacticCowboy

次のようなものを試すことができます:

select *
from jobdetails
where job_no like '071[12]%'

まさにあなたが求めているものではありませんが、同じ効果があり、他の方法でも柔軟です:)

6
Jeremy Smyth

私は同様の目標を持っていた-とこのソリューションに来ました:

select *
from jobdetails as JD
where not exists ( select code from table_of_codes as TC 
                      where JD.job_no like TC.code ) 

私は、%を含むさまざまなコード( '0711%'、 '0712%'など)がテーブルに保存されていると仮定しています。テーブルは、フィールドcode

%がコードのテーブルに保存されていない場合は、単に '%'を連結します。例えば:

select *
from jobdetails as JD
where not exists ( select code from table_of_codes as TC 
                      where JD.job_no like concat(TC.code, '%') ) 

Concat()関数は、私の知る限り、特定のデータベースによって異なる場合があります。

それが役立つことを願っています。私はそれを適応させました:

http://us.generation-nt.com/answer/subquery-wildcards-help-199505721.html

3
Julian
SELECT c.* FROM(
SELECT '071235' AS token UNION ALL SELECT '07113' 
 UNION ALL SELECT '071343'
UNION ALL SELECT '0713SA'
UNION ALL SELECT '071443') AS c
JOIN (
SELECT '0712%' AS pattern UNION ALL SELECT '0711%' 
 UNION ALL SELECT '071343') AS d
ON c.token LIKE d.pattern

071235
07113
071343
3
A-K
  1. 私は最初に、ワイルドカードの結果のすべての可能性を持つ静的テーブルを1つ追加しました(この会社はローカリティとして4文字のnvarcharコードを持ち、ローカルをワイルドカードします)、つまり456を持っていますか? 456 [1]から456 [Z]、つまり0-9およびa-zを与えます

  2. 現在のユーザーをプル(宣言)し、宣言されたユーザーのマスクをプルするスクリプトを作成する必要がありました。

  3. この現在のユーザーの行番号をランク付けするために、基本的な一時テーブルのみを作成します

  4. 各結果をループします(YOUR Or this Or that etc ...)

  5. テストテーブルに挿入します。

私が使用したスクリプトは次のとおりです。

Drop Table #UserMasks 
Drop Table #TESTUserMasks 

Create Table #TESTUserMasks (
    [User] [Int] NOT NULL,
    [Mask] [Nvarchar](10) NOT NULL)

Create Table #UserMasks (
    [RN] [Int] NOT NULL,
    [Mask] [Nvarchar](10) NOT NULL)

DECLARE @User INT
SET @User = 74054

Insert Into #UserMasks 
select ROW_NUMBER() OVER ( PARTITION BY ProntoUserID ORDER BY Id DESC) AS RN,
       REPLACE(mask,'?','') Mask
from dbo.Access_Masks 
where prontouserid = @User

DECLARE @TopFlag INT
SET @TopFlag = 1

WHILE (@TopFlag <=(select COUNT(*) from #UserMasks))
BEGIN
    Insert Into #TestUserMasks 
    select (@User),Code from dbo.MaskArrayLookupTable 
    where code like (select Mask + '%' from #UserMasks Where RN = @TopFlag)

    SET @TopFlag = @TopFlag + 1
END
GO

select * from #TESTUserMasks
2
Tim

IN演算子は、「=」比較の空想的なORにすぎません。実際、SQL 2000には、リストに約1万個のエントリが含まれているときにINORsに展開されるため、スタックオーバーフローのバグがありました(はい、人々がいます) 1万件のINエントリを書き込む...)。そのため、ワイルドカード一致を使用することはできません。

1
Remus Rusanu

ジェレミー・スミスが投稿したように、要約します。彼の特定の質問に答えることができなかったからです。

select *
from jobdetails
where job_no like '071[1-2]%'

0711%0712%だけが必要な場合は、括弧内に範囲を配置することもできます。 NOTキーワードには、[^1-2]%も使用できます

1
Dan Mihalea

Access SQLでは、これを使用します。 SQLserverにも同じ構文があると思います。

job_noで「0711 *」のようなjob_noまたは「0712 *」のようなjob_noから*を選択します

0
PowerUser