SQL Server с использованием шаблона внутри IN
Поскольку я считаю, что это должен быть основной вопрос, я знаю, что этот вопрос, вероятно, был задан, но я не могу его найти. Я, вероятно, собираюсь заработать свой значок Peer Pressure, но я все равно спрошу:
Есть ли способ в SQL Server, о котором я не знаю, для использования символа подстановки% при использовании IN.
Я понимаю, что могу использовать 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', ...)
Как насчет чего-то подобного?
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
Я думаю, что у меня есть решение того, что создатель этого запроса хотел в простой форме. Это работает для меня, и на самом деле это причина, по которой я пришел сюда для начала. Я считаю, что просто использовать круглые скобки вокруг столбца, например «% text%» в сочетании с ORs, это сделает.
select * from tableName where (sameColumnName like '%findThis%' or sameColumnName like '%andThis%' or sameColumnName like '%thisToo%' or sameColumnName like '%andOneMore%')
Вы можете попробовать что-то вроде этого:
select * from jobdetails where job_no like '071[12]%'
Не совсем то, что вы просите, но он имеет тот же эффект и гибкий и другими способами 🙂
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
У меня была аналогичная цель – и пришел к такому решению:
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%» и т. Д.), Включая%, хранятся в таблице, которую я вызываю * table_of_codes *, с кодом поля.
Если% не сохраняется в таблице кодов, просто соедините «%». Например:
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
У меня есть парни! Взял меня полтора часа, царапая мою голову, играя с переменными, но в основном это то, что мне нужно было сделать для обеспечения безопасности в SSAS всех вещей! Пока на моем этапе POC
-
Я сначала добавил одну статическую таблицу со всеми возможностями моих подстановочных результатов (у этой компании есть 4-символьный код nvarchar в качестве их местностей, и они подгоняют своих местных жителей) Т.е. у них может быть 456? что дало бы им 456 [1] до 456 [Z], т. е. 0-9 и az
-
Мне пришлось написать сценарий, чтобы вытащить текущего пользователя (объявить его) и вытащить маски для объявленного пользователя.
-
Создайте несколько временных таблиц только базовыми, чтобы ранжировать номера строк для этого текущего пользователя
-
проведите через каждый результат (ВАШЕ Или это Или то и другое …)
-
Вставьте в таблицу испытаний.
Вот сценарий … надеюсь, вы можете понять это и использовать его для использования 🙂
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
Peer Pressure – это удаление анкера, относится ли оно к вопросам? Я много работал, чтобы заработать мой;). Ans действительно был действительным ответом lol.
Во всяком случае, оператор IN – не что иное, как причудливое ИЛИ сравнения '='. На самом деле это «ничего, кроме», что в SQL 2000 произошла ошибка переполнения стека из-за расширения IN в ORs, когда список содержал около 10k записей (да, есть люди, записывающие записи 10k IN …). Поэтому вы не можете использовать подстановочные знаки в нем.
В Access SQL я бы использовал это. Я бы предположил, что SQLserver имеет тот же синтаксис.
выберите * from jobdetails где job_no like "0711 *" или job_no like "0712 *"
Как сказал Джереми Смит, я напишу, потому что я не мог ответить на этот конкретный вопрос.
select * from jobdetails where job_no like '071[1-2]%'
Если вам нужны только 0711%
и 0712%
вы также можете разместить диапазоны в скобках. Для ключевого слова NOT
вы также можете использовать [^1-2]%
У вас есть ответ прямо в вашем вопросе. Вы не можете напрямую передать подстановочный знак при использовании IN. Однако вы можете использовать подзапрос.
Попробуй это:
select * from jobdetails where job_no in ( select job_no from jobdetails where job_no like '0711%' or job_no like '0712%') )
Я знаю, что это выглядит сумасшедшим, поскольку вы можете просто использовать OR в своем предложении WHERE. почему подзапрос? Как бы то ни было, подзапросы будут полезны, когда вам придется сопоставлять данные из другого источника.
Радж
Попробуй это
select * from jobdetails where job_no between '0711' and '0713'
единственная проблема заключается в том, что job '0713'
также будет возвращено, поэтому можно использовать '07299999999999'
или просто добавить and job_no <> '0713'
Дэн Замир
Это может быть самым простым решением, like any
select * from jobdetails where job_no like any ('0711%', '0712%')
В Терадате это прекрасно работает.