0

SQL Server: Использование подстановочных знаков в операторе IN

15

Описание проблемы: Использование подстановочных знаков в 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 ответ(ов)

0

Ваша строка на SQL выглядит правильно, но есть несколько моментов, на которые стоит обратить внимание для улучшения читабельности и производительности запроса.

Если вы хотите проверить, начинается ли значение job_no с определённых префиксов, использование функции LEFT в вашем запросе действительно допустимо. Однако использование IN может сделать ваш запрос громоздким, особенно если префиксов много.

Вместо этого вы можете использовать оператор LIKE с шаблоном, который может быть более удобным:

WHERE job_no LIKE '0711%' OR job_no LIKE '0712%' OR ...

Такой способ позволит вам легко добавлять новые префиксы без необходимости перечислять их все в IN. Если префиксов много, имеет смысл рассмотреть более оптимизированный подход:

  1. Создайте таблицу с префиксами и соединяйте её с вашей основной таблицей.
  2. Используйте регулярные выражения, если ваша база данных их поддерживает (например, в PostgreSQL):
WHERE job_no ~ '^(0711|0712|...)'

Таким образом, ваш запрос станет более гибким и удобным для поддержания. Надеюсь, это поможет!

0

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

SELECT * FROM tableName
WHERE (sameColumnName LIKE '%findThis%' OR 
       sameColumnName LIKE '%andThis%' OR 
       sameColumnName LIKE '%thisToo%' OR 
       sameColumnName LIKE '%andOneMore%')

Если у вас есть дополнительные вопросы или нужна помощь с другими аспектами, не стесняйтесь задавать!

0

Как насчет чего-то вроде этого?

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

0

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

SELECT *
FROM jobdetails
WHERE job_no LIKE '071[12]%'

Это не совсем то, что вы спрашиваете, но это даст аналогичный эффект и будет гибким в других аспектах тоже 😃

0

Ваш запрос использует конструкцию 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь