Сравнение строк sql: Часть 12.9: Сравнение строк в базах данных: SQL оператор LIKE и SELECT в SQLite. Поиск по шаблону в базах данных при помощи оператора LIKE

sql — Как сравнить значения из соседних строк в отсортированном наборе?

Ну тут, собственно, какие варианты могут быть.

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

Если вычислять на лету — то либо windowed функции, либо join-ы на себя:

select
    d.id, d.value,
    prev = lag(d.value) over (order by d.id)
from data d
select
    d.id, d.value,
    prev = d_lag.value
from data d
    left join data d_lag on d_lag.id = d.id - 1

Если используются оконные функции, то для оптимальной производительности желательно придерживаться т.н. POC (Partitioning, Ordering, Coverage) индексации. Т.е. в данном случае должен быть кластерный индекс по Id, либо некластерный покрывающий index (Id) include (Value). При использовании join-ов эти индексы также пригодятся.

Не совсем понятно, что значит «сравнить значения N подряд идущих строк». Вам нужно N предыдущих строк разложить по столбцам?

select
    id, value,
    prev = lag(value) over (order by id),
    prev2 = lag(value, 2) over (order by id),
    prev3 = lag(value, 3) over (order by id),
    prev4 = lag(value, 4) over (order by id)
from data
select
    d.id, d.value,
    prev = d_lag.value,
    prev2 = d_lag2.value,
    prev3 = d_lag3.value,
    prev4 = d_lag4.value
from data d
    left join data d_lag on d_lag.id = d.id - 1
    left join data d_lag2 on d_lag2.id = d.id - 2
    left join data d_lag3 on d_lag3.id = d.id - 3
    left join data d_lag4 on d_lag4.id = d.id - 4

Или нужно скользящее среднее по N предыдущим строкам?

select
    d.id,
    [ma20(-1)] = avg(d.value) over (order by d.id rows between 20 preceding and 1 preceding)
    [ma20(0)] = avg(d.value) over (order by d.id rows between 19 preceding and current row),
from data d
select
    d.id,
    [ma20(-1)] = [s-1].ma20,
    [ma20(0)] = s0.ma20 
from data d
    cross apply (
        select ma20 = avg(d2. value)
        from data d2
        where d2.id between d.id - 19 and d.id
    ) s0
    cross apply (
        select ma20 = avg(d2.value)
        from data d2
        where d2.id between d.id - 20 and d.id - 1
    ) [s-1]

Можете попробовать эти запросы на своих данных. На тестовых данных в 100 тыс. строк время исполнения запросов для двух методов (windowed и join) у меня получалось сравнимо, только последний запрос выигрывал по времени за счёт параллелелизма, но IO всюду в пользу windowed версий (в случае со скользящим средним — значительно). Вообще по IO все эти windowed запросы сравнимы с простым select id, value from data.

Поскольку оконные функции экономнее по IO, подход с их использованием может быть предпочтительнее в случаях, когда IO является узким местом (например, в системах с большим количеством одновременно работающих пользователей). В иных случаях между join и windowed следует, вероятно, предпочесть то, что работает быстрее на конкретных данных.

Операторы сравнения (Transact-SQL) — SQL Server






Twitter




LinkedIn




Facebook




Адрес электронной почты










  • Статья


Применимо к:База данныхSQL Server Azure SQL Управляемый экземпляр SQL Azure

Операторы сравнения позволяют проверить, одинаковы ли два выражения. Операторы сравнения можно применять ко всем выражениям, за исключением выражений типов text, ntext и image. Операторы сравнения Transact-SQL приведены в следующей таблице.

ОператорЗначение
= (равно)Равно
> (Больше чем)Больше чем
< (Меньше чем)Меньше чем
>= (Больше или равно)Больше или равно
<= (Меньше или равно)Меньше или равно
<> (Не равно)Не равно
!= (не равно)Не равно (не определено стандартом ISO)
!< (Не меньше)Не меньше (не определено стандартом ISO)
!> (Не больше)Не больше (не определено стандартом ISO)

Логический тип данных

Результат выполнения оператора сравнения имеет тип данных Boolean. Он имеет три значения: TRUE, FALSE и UNKNOWN. Выражения, возвращающие значения типа Boolean, называются логическими.

В отличие от других типов данных SQL Server, тип Boolean не может быть типом столбца таблицы или переменной и не может быть возвращен в результирующем наборе.

Если параметр SET ANSI_NULLS имеет значение ON, оператор, в число операндов которого входит хотя бы одно выражение NULL, возвращает UNKNOWN. Если параметр SET ANSI_NULLS имеет значение OFF, применяются те же правила, за исключением операторов равенства (=) и неравенства (<>). Если параметр SET ANSI_NULLS имеет значение OFF, эти операторы обрабатывают значение NULL как известное значение, эквивалентное любым другим значениям NULL, и возвращают только значение TRUE или FALSE (и никогда UNKNOWN).

Выражения со значениями типа Boolean используются в предложении WHERE для фильтрации строк, удовлетворяющих условиям поиска, и в инструкциях языка управления потоком, таких как IF и WHILE, например:

-- Uses AdventureWorks  
  
DECLARE @MyProduct INT;  
SET @MyProduct = 750;  
IF (@MyProduct <> 0)  
   SELECT ProductID, Name, ProductNumber  
   FROM Production. Product  
   WHERE ProductID = @MyProduct;  

См. также

Выражения (Transact-SQL)
Операторы (Transact-SQL)







Сравнение

 — Используйте ‘=’ или LIKE для сравнения строк в SQL?

спросил

Изменено
4 года, 6 месяцев назад

Просмотрено
817 тысяч раз

Существует (почти религиозное) обсуждение, следует ли использовать LIKE или ‘=’ для сравнения строк в операторах SQL.

  • Есть ли причины использовать LIKE?
  • Есть ли причины использовать ‘=’?
  • Производительность? Читаемость?
  • sql
  • сравнение

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

 ВЫБЕРИТЕ * ОТ пользователя, ГДЕ войти в систему, КАК 'Test%';
 

Примеры совпадений:

TestUser1
TestUser2
TestU
Test

0

Чтобы увидеть разницу в производительности, попробуйте следующее:

 SELECT count(*)
ОТ master..sysobjects как A
ПРИСОЕДИНЯЙТЕСЬ к tempdb..sysobjects как B
на A.name = B.name
ВЫБЕРИТЕ количество (*)
ОТ master..sysobjects как A
ПРИСОЕДИНЯЙТЕСЬ к tempdb..sysobjects как B
на A.name НРАВИТСЯ B.name
 

Сравнение строк с ‘=’ выполняется намного быстрее.

1

По моему небольшому опыту:

«=» для точных совпадений.

«НРАВИТСЯ» для частичных совпадений.

1

Есть несколько других трюков, которые Postgres предлагает для сопоставления строк (если это ваша БД):

ILIKE, нечувствительный к регистру LIKE match:

 select * from people where name ilike 'JOHN'
 

Совпадений:

  • Джон
  • Джон
  • ДЖОН

А если вы хотите по-настоящему разозлиться, вы можете использовать регулярные выражения:

 select * from people where name ~ 'John. *'
 

Совпадения:

  • Джон
  • Джонатон
  • Джонни

2

На заметку: оператор ‘=’ дополняет строки пробелами в Transact-SQL. Итак, 'abc' = 'abc' вернет true; 'abc' LIKE 'abc' вернет ложь. В большинстве случаев ‘=’ будет правильным, но в моем недавнем случае это было не так.

Таким образом, несмотря на то, что ‘=’ работает быстрее, LIKE может более явно указать ваши намерения.

http://support.microsoft.com/kb/316626

Для сопоставления с образцом используйте LIKE. Для точного совпадения =.

LIKE используется для сопоставления с образцом, а = используется для проверки равенства (как определено используемым COLLATION ).

= может использовать индексы, в то время как запросы LIKE обычно требуют тестирования каждой отдельной записи в наборе результатов для ее фильтрации (если вы не используете полнотекстовый поиск), поэтому = имеет лучшую производительность.

LIKE выполняет сопоставление символов подстановочных знаков [*, ?] в оболочке
LIKE ‘%suffix’ — дайте мне все, что заканчивается суффиксом. Вы не могли бы сделать это с =
На самом деле зависит от случая.

Есть еще одна причина использовать «подобно», даже если производительность ниже: символьные значения неявно преобразуются в целые числа при сравнении, поэтому:

declare @transid varchar(15)

if @transid != 0

выдаст вам ошибку «Преобразование значения varchar ‘1234567845' переполнило столбец int".

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

sql server - SQL: использование = для сравнения строки с подстановочным знаком

При работе со строками в SQL Server порядок выполняется для каждой буквы, и порядок сортировки этих букв зависит от сортировки. Для некоторых символов метод сортировки гораздо проще понять. Это алфавитный или числовой порядок: например, 'a' < 'b' и '4' > '2' . В зависимости от сортировки это может быть сделано по букве, а затем по регистру ( 'AaBbCc....' ) или по регистру, а затем по букве ( 'ABC...Zabc' ).

Возьмем строку вроде 'Эбби' , это будет отсортировано в порядке букв A, b, b, y (порядок, в котором они будут отображаться, будет соответствовать вашему сопоставлению, и я не знаю, что это такое, но я переход к предполагает 'AaBbCc....' сопоставление, поскольку они более распространены). Любая строка, начинающаяся с чего-то вроде 'Aba' , будет иметь более высокую ценность, чем 'Abby' , поскольку третий символ (первый отличающийся) имеет "меньшее значение". Как и значение «Эбби» ( 'i' имеет меньшее значение, чем 'y' ). Точно так же строка типа 'Abc' будет иметь большее значение, поскольку 'c' имеет более высокое значение, чем 'b' (это первый отличающийся символ).

Если мы добавим числа в смесь, то вы можете быть удивлены. Например, строка (важно, я не указал номер) '123456789' имеет меньшее значение , чем строка '9' . Это связано с тем, что первый символ отличается от первого символа. 9' , м, но я не буду здесь это описывать). '%' представляет несколько символов, а '_' - один символ. Если вы хотите специально искать один из этих символов, вы должны указать их в квадратных скобках ( [] ).

Использование оператора равенства ( = ) не будет анализировать подстановочные знаки. вам нужно использовать функцию, например LIKE . Таким образом, если вам нужно слово, начинающееся с 'A' , вы должны использовать выражение WHERE ColumnName LIKE 'A%' . Если вы хотите найти тот, который состоит из 6 символов и заканчивается 'ed' , вы должны использовать WHERE ColumnName LIKE '____ed' .