47

これは基本的な質問であるべきだと思うので、おそらくこの質問が尋ねられていることは知っていますが、見つけることができません。おそらく仲間からの圧力バッジを獲得しようとしていますが、とにかく質問します。

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 を使用していますが、もっと良い方法が必要であることはわかっています。これにはどのような方法を使用しますか?

4

15 に答える 15

29

どうですか:

WHERE LEFT(job_no, 4) IN ('0711', '0712', ...)
于 2009-07-02T19:05:15.320 に答える
15

私は、この調査の発信者が単純な形で望んでいたことに対する解決策を持っていると思います。それは私のために働きます、そして実際それは私が最初にここに来た理由です。'%text%'のように列を括弧で囲んだものをORsと組み合わせて使用​​するだけでうまくいくと思います。

select * from tableName
where (sameColumnName like '%findThis%' or sameColumnName like '%andThis%' or 
sameColumnName like '%thisToo%' or sameColumnName like '%andOneMore%') 
于 2010-11-30T17:01:59.283 に答える
11

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

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
于 2009-07-02T19:15:22.880 に答える
8

あなたはこのようなことを試すことができます:

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

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

于 2009-07-02T19:05:23.417 に答える
4
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
于 2009-07-02T19:11:57.117 に答える
4

同様の目標がありました-そして、この解決策にたどり着きました:

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%' など) がテーブルに格納されていると想定しています

% がコード表に格納されていない場合は、'%' を連結するだけです。例えば:

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

于 2012-11-14T09:24:21.293 に答える
2
  1. 最初に、ワイルドカード結果のすべての可能性を含む静的テーブルから1つを追加しました(この会社は、地域として4文字のnvarcharコードを持ち、地域をワイルドカードしています)。つまり、456を持っている可能性がありますか? これにより、456[1] から 456[Z]、つまり 0-9 & az が得られます

  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
于 2011-11-21T20:37:04.993 に答える
1

演算子は、「=」比較のIN空想に他なりません。OR実際、SQL 2000 では、リストに約 10k のエントリが含まれていたときINORs への展開が原因でスタック オーバーフローのバグがあったほどです (はい、10k の IN エントリを書いている人がいます...)。そのため、ワイルドカード マッチングを使用することはできません。

于 2009-07-02T19:13:42.073 に答える
0

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

select * from jobdetails where job_no like "0711*" または job_no like "0712*"

于 2009-07-02T19:36:32.887 に答える
-1

これを試して

select * 
from jobdetails 
where job_no between '0711' and '0713'

唯一の問題は、それjob '0713'も返されるので、使用する'07299999999999'か、単に追加することができるということですand job_no <> '0713'

ダン・ザミール

于 2010-02-07T14:08:04.240 に答える
-1

あなたの質問に答えがあります。IN を使用する場合、ワイルドカードを直接渡すことはできません。ただし、サブクエリを使用できます。

これを試して:

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

WHERE 句で OR を使用することに固執できるため、これがおかしいように見えることはわかっています。なぜサブクエリ?ただし、サブクエリのアプローチは、別のソースからの詳細を照合する必要がある場合に役立ちます。

ラージ

于 2009-07-02T19:13:55.740 に答える
-4

これは私にとって最も簡単なソリューションの使用かもしれませんlike any

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

Teradata では、これで問題なく動作します。

于 2015-09-28T13:52:41.957 に答える