Ответ 1
Как насчет:
WHERE LEFT(job_no, 4) IN ('0711', '0712', ...)
Поскольку я считаю, что это должен быть основной вопрос, я знаю, что этот вопрос, вероятно, был задан, но я не могу его найти. Я, вероятно, собираюсь заработать свой значок равного уровня, но я все равно спрошу:
Есть ли способ в 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%')
В этом случае знак процента используется как символ вместо символа подстановки, поэтому строки не возвращаются. В настоящее время я просто использую кучу ИЛИ, когда я должен это делать, но я знаю, что должен быть лучший способ. Какой метод вы используете для этого?
Как насчет:
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] 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
Peer Pressure предназначен для удаления анкера, относится ли оно к вопросам? Я много работал, чтобы заработать мой;). Фактически Ans был действительным ответом lol.
Во всяком случае, оператор IN - не что иное, как причудливое ИЛИ сравнения '='. На самом деле это "ничего, кроме", что в SQL 2000 произошла ошибка из-за расширения IN в ORs, когда список содержал около 10k записей (да, есть люди, записывающие записи 10k IN...). Таким образом, вы не можете использовать подстановочные знаки в нем.
В Access SQL я бы это использовал. Я бы предположил, что SQLserver имеет тот же синтаксис.
выберите * от 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%')
В Teradata это отлично работает.