これは基本的な質問であるべきだと思うので、この質問はおそらく尋ねられたと思いますが、見つけることができません。おそらくピアプレッシャーバッジを獲得しようとしていますが、とにかく質問します。
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を使用していますが、もっと良い方法が必要だと思います。これにはどのような方法を使用しますか?
どうですか:
WHERE LEFT(job_no, 4) IN ('0711', '0712', ...)
私は、この調査の発信者が単純な形で望んでいたことに対する解決策があると思います。それは私のために働いており、実際それは私が最初にここに来た理由です。 '%text%'のような列をカッコで囲んでOR
sと組み合わせて使用すると思います。
select * from tableName
where (sameColumnName like '%findThis%' or sameColumnName like '%andThis%' or
sameColumnName like '%thisToo%' or sameColumnName like '%andOneMore%')
このようなものはどうですか?
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
次のようなものを試すことができます:
select *
from jobdetails
where job_no like '071[12]%'
まさにあなたが求めているものではありませんが、同じ効果があり、他の方法でも柔軟です:)
私は同様の目標を持っていた-とこのソリューションに来ました:
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
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
私は最初に、ワイルドカードの結果のすべての可能性を持つ静的テーブルを1つ追加しました(この会社はローカリティとして4文字のnvarcharコードを持ち、ローカルをワイルドカードします)、つまり456を持っていますか? 456 [1]から456 [Z]、つまり0-9およびa-zを与えます
現在のユーザーをプル(宣言)し、宣言されたユーザーのマスクをプルするスクリプトを作成する必要がありました。
この現在のユーザーの行番号をランク付けするために、基本的な一時テーブルのみを作成します
各結果をループします(YOUR Or this Or that etc ...)
テストテーブルに挿入します。
私が使用したスクリプトは次のとおりです。
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
IN
演算子は、「=」比較の空想的なOR
にすぎません。実際、SQL 2000には、リストに約1万個のエントリが含まれているときにIN
がOR
sに展開されるため、スタックオーバーフローのバグがありました(はい、人々がいます) 1万件のINエントリを書き込む...)。そのため、ワイルドカード一致を使用することはできません。
ジェレミー・スミスが投稿したように、要約します。彼の特定の質問に答えることができなかったからです。
select *
from jobdetails
where job_no like '071[1-2]%'
0711%
と0712%
だけが必要な場合は、括弧内に範囲を配置することもできます。 NOT
キーワードには、[^1-2]%
も使用できます
Access SQLでは、これを使用します。 SQLserverにも同じ構文があると思います。
job_noで「0711 *」のようなjob_noまたは「0712 *」のようなjob_noから*を選択します