SQL Server: Использование подстановочных знаков в операторе IN
Описание проблемы: Использование подстановочных знаков в 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, когда мне нужно это сделать, но я уверен, что должен быть более эффективный способ. Какой метод вы используете для решения этой задачи?
5 ответ(ов)
Ваша строка на SQL выглядит правильно, но есть несколько моментов, на которые стоит обратить внимание для улучшения читабельности и производительности запроса.
Если вы хотите проверить, начинается ли значение job_no
с определённых префиксов, использование функции LEFT
в вашем запросе действительно допустимо. Однако использование IN
может сделать ваш запрос громоздким, особенно если префиксов много.
Вместо этого вы можете использовать оператор LIKE
с шаблоном, который может быть более удобным:
WHERE job_no LIKE '0711%' OR job_no LIKE '0712%' OR ...
Такой способ позволит вам легко добавлять новые префиксы без необходимости перечислять их все в IN
. Если префиксов много, имеет смысл рассмотреть более оптимизированный подход:
- Создайте таблицу с префиксами и соединяйте её с вашей основной таблицей.
- Используйте регулярные выражения, если ваша база данных их поддерживает (например, в PostgreSQL):
WHERE job_no ~ '^(0711|0712|...)'
Таким образом, ваш запрос станет более гибким и удобным для поддержания. Надеюсь, это поможет!
Я думаю, что у меня есть решение для того, что искал автор этого вопроса, в простой форме. Это работает для меня, и именно поэтому я пришёл сюда. Я полагаю, что просто использование скобок вокруг столбца, как '%text%', в сочетании с OR
должно сработать.
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)
)
-- добавьте любые критерии, которые вам нужны...
insert into @search select '0711%' union select '0712%'
select j.*
from jobdetails j
join @search s on j.job_no like s.searchString
В этом примере мы создаем временную таблицу @search
, в которую добавляем строки поиска. Затем выполняем выборку из таблицы jobdetails
, соединяя её с временной таблицей @search
по условию, что столбец job_no
соответствует шаблону строки поиска. Вы можете изменить содержимое временной таблицы, добавляя или удаляя условия поиска по вашему усмотрению.
Вы можете попробовать что-то вроде этого:
SELECT *
FROM jobdetails
WHERE job_no LIKE '071[12]%'
Это не совсем то, что вы спрашиваете, но это даст аналогичный эффект и будет гибким в других аспектах тоже 😃
Ваш запрос использует конструкцию JOIN
, чтобы отобрать значения токенов, которые соответствуют заданным паттернам. Однако в текущей форме ваш запрос не будет работать должным образом, так как оператор LIKE
не поддерживает подстановочные символы %
в комбинации с значениям типа строки как часть оператора ON
. Вам необходимо использовать LIKE
в условии соединения, но с небольшой модификацией.
Вот исправленный вариант вашего SQL-запроса, который должен правильно возвращать нужные значения:
SELECT c.token
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
Обратите внимание на то, что строка LIKE
теперь использует d.pattern
с добавлением || '%'
, что указывает на поиск совпадений, начинающихся с указанного шаблона. Базируясь на исходных данных, результатом будут токены 071235
, 07113
и 071343
.
Обновление данных в одной таблице из другой на основе совпадения ID
Как вставить перенос строки в строке VARCHAR/NVARCHAR SQL Server
Возможно ли задать условия в Count()?
SQL LIKE без подстановочных символов эквивалентен '='?
with(nolock) или (nolock) - есть ли разница?