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

    1. Я сначала добавил одну статическую таблицу со всеми возможностями моих подстановочных результатов (у этой компании есть 4-символьный код nvarchar в качестве их местностей, и они подгоняют своих местных жителей) Т.е. у них может быть 456? что дало бы им 456 [1] до 456 [Z], т. е. 0-9 и az

    2. Мне пришлось написать сценарий, чтобы вытащить текущего пользователя (объявить его) и вытащить маски для объявленного пользователя.

    3. Создайте несколько временных таблиц только базовыми, чтобы ранжировать номера строк для этого текущего пользователя

    4. проведите через каждый результат (ВАШЕ Или это Или то и другое …)

    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 

    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%') 

    В Терадате это прекрасно работает.

    Interesting Posts

    SQL – ПРИСОЕДИНЯЙТЕСЬ С СБОРОЧНЫМ ТАБЛИЦОМ С НЕАГРЕГАТЫМ ТАБЛИЦОМ

    Заказ пользовательского результата с использованием UNION – TSQL

    SQL: короткое замыкание не работает. «Нулевой или пустой полнотекстовый предикат» после перехода на SQL Server 2012

    Импорт данных из CSV-файлов в SQL Server с дополнительным столбцом с помощью PowerShell

    Как удалить дубликаты в SQL, но сохранить одну копию?

    Ужасный SQL читает производительность (статистика обновления для злоумышленника?)

    Можно ли создавать табличные методы * в пользовательском типе SQL CLR?

    T-SQL использует другое предложение WHERE, основанное на значении входного параметра

    Поддерживает ли TransactionScope выполнение атомной базы данных?

    Синхронизация баз данных SQL Server

    Проблемы подключения с SQL Server в приложениях ASP.NET с использованием состояния сеанса вне процесса

    Вставка данных в таблицу SQL из таблицы Excel

    Передача списка настраиваемого объекта в хранимую процедуру SQL Server

    Агрегаты SQL OVER и PARTITION

    Может ли AWE использовать> 4 ГБ оперативной памяти в выпуске SQL Server 2005 для Windows XP с 32-разрядной версией

    Давайте будем гением компьютера.