Оператор Like для целого числа

У меня есть столбец типа bigint (ProductSerial) в моей таблице. Мне нужно отфильтровать таблицу по серийному используя оператор like. Но я обнаружил, что оператор like не может использоваться для целочисленного типа.

есть ли другой способ для этого (я не хочу использовать = оператор).

5 ответов


если вы должны использовать LIKE, вы можете бросить свой номер в char/varchar, и выполнить LIKE на результат. Это довольно неэффективно, но так как LIKE имеет высокий потенциал индексов убийства в любом случае, он может работать в вашем сценарии:

... AND CAST(phone AS VARCHAR(9)) LIKE '%0203'

если вы хотите использовать LIKE чтобы соответствовать началу или концу числа, вы можете использовать целочисленные операторы деления и модуля для извлечения цифр. Например, если вы хотите, чтобы все девятизначные числа начинались с 407 поиск

phone / 1000000 = 407

хотя я немного опоздал на вечеринку, я хотел бы добавить метод, который я использую, чтобы соответствовать первым N заданным числам (в Примере, 123) в любом столбце числового типа:

SELECT * FROM MyTable WHERE MyColumn / POWER(10, LEN(MyColumn) - LEN(123)) = 123

метод похож на метод @dasblinkenlight, но он работает независимо от количества цифр значений целевого столбца. Это жизнеспособный обходной путь, если ваш столбец содержит числа с разной длиной, и вы не хотите использовать метод CAST+LIKE (или вычисляемый столбец.)

для получения дополнительной информации об этом (и других подобных обходных путях), читать этот пост.


вы можете изменить свое поле PhoneNumbers и сохранить как строку, а затем использовать Like вы можете изменить свою таблицу, чтобы вы могли использовать оператор LIKE, если вы все еще хотите использовать BIGint для своих телефонных номеров, вы не можете получить точный номер телефона без использования = метод, который вы можете использовать, находится между методом, который ищет номера, которые находятся внутри диапазона.

для отредактированного вопроса: я думаю, вы должны использовать = sign для своего ID или преобразовать Int в строку, а затем использовать Как.


исходный вопрос, связанный с телефонным номером. С тех пор OP отредактировал его, чтобы ссылаться на серийные номера. Этот ответ относится только к первоначальному вопросу.

мое предложение состоит в том, чтобы не хранить телефонные номера как целые числа, в первую очередь, и, таким образом, проблема не возникает. Мой номер телефона в международной форме:

    +44 7844 51515

хранить его как целое число здесь не имеет смысла, так как вам никогда не понадобится выполнять какие-либо математические операции на нем и вы потеряете главный плюс. В Великобритании это:

    07844 51515

и, таким образом, сохранение его как целого числа потеряет начальный ноль. Если у вас нет очень очень конкретное требование хранить его как целое число, вам было бы значительно лучше хранить его как строку.

[Примечание: На самом деле не мой номер телефона]


Если у вас есть контроль над базой данных, вы можете добавить вычисляемый столбец, чтобы скопировать целое значение в строку:

ALTER TABLE MyTable
ADD CalcCol AS (CAST(ProductSerial AS VARCHAR)) PERSISTED

и запрос типа:

SELECT *
FROM MyTable
WHERE ProductSerial LIKE '%2548%'

это приведет к перемещению вычисления в insert/update и только для вставленных / обновленных строк, а не к преобразованию каждой строки для каждого запроса. Это может быть проблемой, если есть много обновленных столбцов, поскольку это добавит к ним очень небольшие накладные расходы.

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