В SQL я (к сожалению) часто вынужден использовать « LIKE
» условия из-за баз данных, которые нарушают почти все правила нормализации. Я не могу изменить это прямо сейчас. Но это не имеет отношения к вопросу.
Кроме того, я часто использую такие условия, как WHERE something in (1,1,2,3,5,8,13,21)
для лучшей читаемости и гибкости моих операторов SQL.
Есть ли возможный способ объединить эти две вещи без написания сложных подвыборов?
Я хочу что-то так просто, как WHERE something LIKE ('bla%', '%foo%', 'batz%')
вместо этого:
WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'
Я работаю здесь с SQl Server и Oracle, но мне интересно, возможно ли это вообще в любой СУБД.
like any
/like all
: stackoverflow.com/questions/40475982/sql-like-any-vs-like-all . (Для сведения, это было запрошено на форуме Oracle Community Ideas community.oracle.com/ideas/11592 )Ответы:
В SQL нет комбинации LIKE & IN, а тем более в TSQL (SQL Server) или PLSQL (Oracle). Частично это объясняется тем, что полнотекстовый поиск (FTS) является рекомендуемой альтернативой.
Реализации FTS как Oracle, так и SQL Server поддерживают ключевое слово CONTAINS, но синтаксис все же немного отличается:
Oracle:
SQL Server:
Столбец, который вы запрашиваете, должен быть полнотекстовым индексированным.
Ссылка:
источник
Если вы хотите, чтобы ваше заявление было легко читаемым, вы можете использовать REGEXP_LIKE (доступно начиная с версии Oracle 10).
Пример таблицы:
Оригинальный синтаксис:
И простой запрос с REGEXP_LIKE
НО ...
Я не рекомендовал бы это сам из-за не очень хорошей работы. Я бы придерживался нескольких предикатов LIKE. Так что примеры были просто для удовольствия.
источник
ты застрял с
если вы не заполнили временную таблицу (включите подстановочные знаки с данными) и присоединились следующим образом:
попробуйте это (используя синтаксис SQL Server):
ВЫВОД:
источник
LIKE 'bla%'
, что в примере кода OP? или может только вLIKE '%bla%'
поисках?В PostgreSQL есть форма
ANY
илиALL
:или
где подвыбор возвращает ровно один столбец данных.
источник
LIKE ANY
иLIKE ALL
общие для всех диалектов SQL, т.е. часть основного языка, или специфичной для диалекте?= ANY
или<> ALL
работает только в SQL, а не в PLSQL, например.Другое решение, должно работать на любой RDBMS:
источник
Я бы предложил использовать пользовательскую функцию TableValue, если вы хотите инкапсулировать методы Inner Join или Temp Table, показанные выше. Это позволило бы читать немного яснее.
После использования функции разделения, определенной по адресу: http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx
мы можем написать следующее на основе созданной мною таблицы «Рыба» (int id, varchar (50) Name)
Выходы
источник
Одним из подходов было бы сохранить условия во временной таблице (или табличной переменной в SQL Server) и присоединиться к ней следующим образом:
источник
Вместо этого используйте внутреннее соединение:
источник
Teradata поддерживает синтаксис LIKE ALL / ANY :
РЕДАКТИРОВАТЬ:
jOOQ версии 3.12.0 поддерживает этот синтаксис:
Добавить синтетические [NOT] LIKE ANY и [NOT] LIKE ALL операторы
PostgreSQL
LIKE/ILIKE ANY (ARRAY[])
:db <> Fiddle demo
Снежинка также поддерживает LIKE ANY / LIKE ALL соответствия:
Пример:
источник
ты можешь даже попробовать это
функция
запрос
источник
У меня есть простое решение, которое работает, по крайней мере, в postgresql , с использованием
like any
списка регулярных выражений. Вот пример, глядя на выявление некоторых антибиотиков в списке:источник
Мне тоже было интересно что-то подобное. Я только что проверил, используя комбинацию
SUBSTRING
и,IN
и это эффективное решение для такого рода проблемы. Попробуйте следующий запрос:источник
В Oracle вы можете использовать коллекцию следующим образом:
Здесь я использовал предопределенный тип коллекции
ku$_vcnt
, но вы можете объявить свой собственный так:источник
Для Sql Server вы можете прибегнуть к динамическому SQL.
В большинстве случаев в таких ситуациях у вас есть параметр предложения IN, основанный на некоторых данных из базы данных.
Приведенный ниже пример немного «принудительный», но он может соответствовать различным реальным случаям, найденным в устаревших базах данных.
Предположим, у вас есть таблица Persons, в которой имена людей хранятся в одном поле PersonName как FirstName + '' + LastName. Вам необходимо выбрать всех людей из списка имен, хранящегося в поле NameToSelect в таблице NamesToSelect , а также некоторые дополнительные критерии (например, отфильтрованные по полу, дате рождения и т. Д.)
Вы можете сделать это следующим образом
источник
У меня может быть решение для этого, хотя оно будет работать только в SQL Server 2008, насколько я знаю. Я обнаружил, что вы можете использовать конструктор строк, описанный в https://stackoverflow.com/a/7285095/894974, чтобы присоединиться к «вымышленной» таблице с помощью предложения like. Это звучит сложнее, чем это, смотрите:
Это приведет к тому, что все пользователи будут иметь адреса электронной почты, подобные тем, которые указаны в списке. Надеюсь, это кому-нибудь пригодится. Проблема беспокоила меня некоторое время.
источник
Начиная с 2016 года, SQL Server включает
STRING_SPLIT
функцию . Я использую SQL Server v17.4, и у меня это работает:источник
Если вы используете MySQL, вы можете получить полнотекстовый поиск:
Полнотекстовый поиск, документация MySQL
источник
Это работает для значений, разделенных запятыми
Оценивает:
Если вы хотите, чтобы он использовал индексы, вы должны опустить первый
'%'
символ.источник
В Oracle RBDMS вы можете добиться этого, используя функцию REGEXP_LIKE .
Следующий код проверит, присутствует ли строка три в выражении списка one | два | три | четыре | пять (в котором символ " | " канала означает логическую операцию ИЛИ).
Предыдущее выражение эквивалентно:
Так и получится.
С другой стороны, следующий тест не пройден.
Существует несколько функций, связанных с регулярными выражениями (REGEXP_ *), доступных в Oracle начиная с версии 10g. Если вы разработчик Oracle и заинтересована эта тема , это должно быть хорошим началом Использования регулярных выражений с Oracle Database .
источник
Может быть, вы думаете, комбинация, как это:
Если вы определили полнотекстовый индекс для вашей целевой таблицы, вы можете использовать эту альтернативу:
источник
Нет ответа, как это:
У оракула нет проблем.
источник
В Teradata вы можете использовать
LIKE ANY ('%ABC%','%PQR%','%XYZ%')
. Ниже приведен пример, который дал те же результаты для меняисточник
Я знаю, что очень поздно, но у меня была похожая ситуация. Мне понадобился оператор «Like In» для набора хранимых процедур, который принимает много параметров, а затем использует эти параметры для агрегирования данных из нескольких систем RDBMS, поэтому никакие специфичные для RDBMS приемы не будут работать, однако хранимая процедура и любые функции будет работать на MS SQL Server, поэтому мы можем использовать T-SQL для функциональности генерации полных операторов SQL для каждой СУБД, но выходные данные должны быть достаточно независимыми от СУБД.
Это то, что я на данный момент придумал, чтобы превратить разделенную строку (например, параметр, входящий в хранимую процедуру) в блок SQL. Я называю это «лишайником» для «LIKE IN». Возьми?
Lichen.sql
Обнаружение разделителя возможно запланировано, но сейчас по умолчанию используется точка с запятой, так что вы можете просто вставить его
default
туда. В этом, вероятно, есть ошибки.@leadingAnd
Параметр только немного значение , чтобы определить , если вы хотите , ведущий «И» положить в передней части блока , так что прекрасно вписывается в другие предложения WHERE добавлений.Пример использования (с разделителем в argString)
Вернет nvarchar (512), содержащий:
Он также пропустит блок, если на входе нет разделителя:
Пример использования (без разделителя в argString)
Вернет nvarchar (512), содержащий:
Я собираюсь продолжить работу над этим, поэтому, если я что-то упустил (явно очевидное или иное), пожалуйста, не стесняйтесь комментировать или обратиться.
источник
сделай это
или
источник