Подтвердить что ты не робот

SQL Server с использованием шаблона внутри IN

Поскольку я считаю, что это должен быть основной вопрос, я знаю, что этот вопрос, вероятно, был задан, но я не могу его найти. Я, вероятно, собираюсь заработать свой значок равного уровня, но я все равно спрошу:

Есть ли способ в 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%')

В этом случае знак процента используется как символ вместо символа подстановки, поэтому строки не возвращаются. В настоящее время я просто использую кучу ИЛИ, когда я должен это делать, но я знаю, что должен быть лучший способ. Какой метод вы используете для этого?

4b9b3361

Ответ 1

Как насчет:

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

Ответ 2

Как насчет чего-то подобного?

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

Ответ 3

Я думаю, что у меня есть решение того, что создатель этого запроса хотел в простой форме. Это работает для меня, и на самом деле это причина, по которой я пришел сюда для начала. Я считаю, что просто использовать круглые скобки вокруг столбца, например "% text%" в сочетании с ORs, это сделает.

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

Ответ 4

Вы можете попробовать что-то вроде этого:

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

Не совсем то, что вы просите, но он имеет тот же эффект и гибкий и другими способами:)

Ответ 5

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

Ответ 6

У меня была аналогичная цель - и пришел к такому решению:

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

Ответ 7

У меня есть ребята! Взял меня полтора часа, царапая мою голову, играя с переменными, но в основном это то, что мне нужно было сделать для обеспечения безопасности в SSAS всех вещей! Пока на моем этапе POC

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

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

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

  • цикл через каждый результат (ВАШЕ Или это Или что и т.д.)

  • Вставить в тестовую таблицу.

Вот script... надеюсь, вы можете понять это и использовать его:)

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

Ответ 8

Peer Pressure предназначен для удаления анкера, относится ли оно к вопросам? Я много работал, чтобы заработать мой;). Фактически Ans был действительным ответом lol.

Во всяком случае, оператор IN - не что иное, как причудливое ИЛИ сравнения '='. На самом деле это "ничего, кроме", что в SQL 2000 произошла ошибка из-за расширения IN в ORs, когда список содержал около 10k записей (да, есть люди, записывающие записи 10k IN...). Таким образом, вы не можете использовать подстановочные знаки в нем.

Ответ 9

В Access SQL я бы это использовал. Я бы предположил, что SQLserver имеет тот же синтаксис.

выберите * от jobdetails где job_no like "0711 *" или job_no like "0712 *"

Ответ 10

Как сказал Джереми Смит, я напишу, потому что я не мог ответить на этот конкретный вопрос о нем.

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

Если вам просто нужны 0711% и 0712%, вы также можете поместить диапазоны в скобки. Для ключевого слова NOT вы также можете использовать [^1-2]%

Ответ 11

У вас есть ответ прямо в вашем вопросе. Вы не можете напрямую передать подстановочный знак при использовании 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. почему подзапрос? Как бы то ни было, подход подзапроса будет полезен, когда вам нужно сопоставить данные из другого источника.

Раджа

Ответ 12

Попробуйте это

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

единственная проблема заключается в том, что job '0713' также будет возвращено поэтому можно использовать '07299999999999' или просто добавить and job_no <> '0713'

Дэн Замир

Ответ 13

Это может быть самое простое решение, использующее like any

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

В Teradata это отлично работает.