Запрос SQL с похожими значениями - PullRequest
0 голосов
/ 21 июня 2019

Я должен сделать запрос к базе, используя для сравнения строку, подобную этой 12345678, но значение для сравнения будет таким: 12.345.678, если я сделаю следующий запрос, он ничего не вернет.

SELECT * FROM TABLA WHERE CAMPO = '12345678'

Если CAMPO будет иметь значение (12.345.678), если я заменим = на like, он также не вернет данные

SELECT * FROM TABLA WHERE CAMPO like '12345678%'
SELECT * FROM TABLA WHERE CAMPO like '%12345678'
SELECT * FROM TABLA WHERE CAMPO like '%12345678%'

Ни один из3 предыдущие консультации работают для меня, как я могу сделать этот запрос?

Значение может состоять из 7, 8 или 9 чисел и.Должно быть каждые 3 от конца до начала

Ответы [ 5 ]

3 голосов
/ 21 июня 2019

Используйте функцию REPLACE(), чтобы заменить все точки '.' на

SELECT *
FROM(
     VALUES ('12.345.678'),
            ('23.456.789')
    ) T(CAMPO)
WHERE REPLACE(CAMPO, '.', '') = '12345678';

Ваш запрос должен быть

SELECT * FROM TABLA WHERE REPLACE(CAMPO, '.', '') = '12345678';
3 голосов
/ 21 июня 2019

Вы можете сравнить строку без точек с REPLACE(StringWithDots, '.','')

0 голосов
/ 22 июня 2019

Если таблица, содержащая идентификаторы, такие как 12.345.678, большая (содержит много записей), я бы добавил вычисляемое поле, которое удаляет точки (и если этот идентификатор никогда не содержит никаких буквенно-цифровых символов, кроме точек, и не имеет значительных начальных нулей). затем также приведите его к INT или BIGINT), сохраните его и наложите на него индекс. Таким образом, вы теряете немного времени при вставке записи, но запрашиваете ее с максимальной скоростью и, следовательно, экономите мощность процессора.

0 голосов
/ 21 июня 2019

A SARGABLE решение состоит в том, чтобы написать функцию, которая принимает целевое значение ('12345678') и вставляет разделители ('.') в каждый третий символ справа налево.Затем результат ('12.345.678') можно использовать в предложении where и использовать индекс для CAMPO.

. Следующий код демонстрирует подход без создания пользовательской функции (UDF).Вместо этого используется рекурсивное общее табличное выражение (CTE) для обработки входной строки по три символа за раз, чтобы построить пунктирную целевую строку.Результат используется в запросе к образцу таблицы.

Чтобы увидеть результаты из рекурсивного CTE, замените окончательный оператор select комментарием select непосредственно над ним.

-- Sample data.
declare @Samples as Table ( SampleId Int Identity, DottedDigits VarChar(20) );
insert into @Samples ( DottedDigits ) values
  ( '1' ), ( '12' ), ( '123' ), ( '1.234' ), ( '12.345' ),
  ( '123.456' ), ( '1.234.567' ), ( '12.345.678' ), ( '123.456.789' );
select * from @Samples;

-- Query the data.
declare @Target as VarChar(15) = '12345678';

with
  Target as (
    -- Get the first group of up to three characters from the tail of the string ...
    select
      Cast( Right( @Target, 3 ) as VarChar(20) ) as TargetString,
      Cast( Left( @Target, case when Len( @Target ) > 3 then Len( @Target ) - 3 else 0 end ) as VarChar(20) ) as Remainder
    union all
    -- ... and concatenate the next group with a dot in between.
    select
      Cast( Right( Remainder, 3 ) + '.' + TargetString as VarChar(20) ),
      Cast( Left( Remainder, case when Len( Remainder ) > 3 then Len( Remainder ) - 3 else 0 end ) as VarChar(20) )
      from Target
      where Remainder != ''
  )
  -- To see the intermediate results replace the final   select   with the line commented out below:
  --select TargetString from Target;
  select SampleId, DottedDigits
    from @Samples
    where DottedDigits = ( select TargetString from Target where Remainder = '' );

Альтернативным подходом было бы добавить индексированный вычисляемый столбец к таблице, содержащей Replace( CAMPO, '.', '' ).

0 голосов
/ 21 июня 2019

Рекомендую преобразовать число в числовое

Таким образом, вы можете использовать операторы <и> и все функции, которые требуют, чтобы у вас был номер ...

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

CONVERT(NUMERIC(10, 2), 
               REPLACE(
                       REPLACE('7.000,45', '.', ''),
                       ',', '.'
                      )
              )

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...