#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть таблица в базе данных SQL с именем ‘customer‘, которая имеет имя столбца с именем ‘customer_no‘ реального типа данных. данные, содержащиеся в столбце ‘customer_no‘, следующие:
customer_no
........
........
54213154
11011011
11011012
11011013
11011014
11011215
11011015
11011101
45121478
........
........
Я хочу получить значения столбца, начинающиеся с 1101, используя сопоставление с шаблоном подстановочных знаков. Я использую SQL Server Management Studio. Я выполнил следующий SQL-запрос, чтобы получить результат:
select * from customer
where CONVERT(VARCHAR(100), customer_no) like '1101%';
Но проблема в том, что я получаю 0 строк в качестве выходных данных. Что-то не так в приведенном выше запросе? Как я могу получить желаемый результат?
Комментарии:
1. Вы используете MySQL или MS SQL Server?
2. MS SQL Server @jarlh
3. Я не могу придумать какой-либо очевидной причины, по которой ваш запрос не будет работать. Это в сочетании с вашим комментарием к ответу @GordonLinhoff наводит меня на мысль, что вы упростили свою проблему для публикации здесь, но при этом вы, возможно, сделали что-то, что коренным образом изменило характер проблемы (или даже эффективно устранило ее). Я бы предложил переформулировать вашу проблему с немного большей реальной сложностью.
4. Каков тип данных номера клиента? Я подозреваю, что это не число и имеет начальные пробелы или что-то в этом роде.
5. тип данных реальный @Gordon Linoff
Ответ №1:
Если номер клиента является целым числом, почему бы не использовать:
where customer_no >= 11010000 and
customer_no < 11020000
Комментарии:
1. Я показал частичное представление данных таблицы. на самом деле данных больше, и я не могу привязать их к диапазону, как вы показали. Я хочу получить результат с помощью сопоставления с шаблоном подстановочных знаков. @Гордон Линофф
2. @user14216688 Я думаю, что вам следует повторно представить свою проблему, чтобы было ясно, почему ответ Гордона не применяется. Ответ Гордона часто может быть распространен на ряд более сложных ситуаций реального мира, но мы не можем посоветовать вам это, потому что мы не знаем, каковы фактические сложности вашей ситуации.
Ответ №2:
сначала необходимо преобразовать реальное значение в числовое
CREATE TABLE #customer
(
customer_no real
)
INSERT INTO #customer(customer_no) SELECT 54213154
INSERT INTO #customer(customer_no) SELECT 11011011
INSERT INTO #customer(customer_no) SELECT 11011012
INSERT INTO #customer(customer_no) SELECT 11011013
INSERT INTO #customer(customer_no) SELECT 11011014
INSERT INTO #customer(customer_no) SELECT 11011215
INSERT INTO #customer(customer_no) SELECT 11011015
INSERT INTO #customer(customer_no) SELECT 11011101
INSERT INTO #customer(customer_no) SELECT 11021014
INSERT INTO #customer(customer_no) SELECT 45121478
SELECT * FROM #customer
WHERE CONVERT(VARCHAR(100),CONVERT(NUMERIC, customer_no)) like '1101%';
DROP TABLE #customer
Ответ №3:
Когда значения преобразуются в символьное представление, используется научная нотация, поэтому шаблон не соответствует.
Сработает ли математика?
where cast(floor(customer_no) as int) /
cast(power(10, floor(log10(customer_no) - 3)) as int) = 1101
-- note that floor(log10(1101)) = 3
Другой совет, который вы получили, кажется разумным, поэтому это действительно применимо, только если, например, длина идентификатора является переменной. Использование значения с плавающей запятой для идентификатора вызывает только головную боль.