Преобразование значения столбца из реального типа данных в строку во время сопоставления с образцом в SQL-запросе

#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
  

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