Sql: использование <= и> = для сравнения строки с подстановочным знаком

Предположим, у меня есть таблица, которая выглядит так:

Id  |  Name  |  Age
=====================
1   |  Jose  | 19

2   |  Yolly | 26

20  |  Abby  | 3

29  |  Tara  | 4

И мой запрос:

1) Select * from thisTable where Name <= '*Abby'; он возвращает 0 строку

2) Select * from thisTable where Name <= 'Abby'; возвращает строку с Эбби

3) Select * from thisTable where Name >= 'Abby'; возвращает все строки // строки 1-4

4) Select * from thisTable where Name >= '*Abby'; возвращает все строки; // строки 1-4

5) Select * from thisTable where Name >= '*Abby' and Name <= "*Abby"; возвращает 0 строку.

6) Select * from thisTable where Name >= 'Abby' and Name <= 'Abby'; возвращает строку с Эбби;

Мой вопрос: почему я получил такие результаты? Как подстановочный знак влияет на результат запроса? Почему я не получаю никакого результата, если условие - это Name <= '*Abby'?

Подстановочные знаки - это сравнения нет. Язык SQL в любом случае не использует * в качестве подстановочного знака. Если вы хотите выполнить поиск по шаблону, используйте LIKE, например LIKE 'Abby%'

Panagiotis Kanavos 10.09.2018 09:53

Все ваши результаты просто объясняются, поскольку * здесь не имеет особого значения, и при любом сопоставлении, которое вы используете, он сортируется до A.

Damien_The_Unbeliever 10.09.2018 09:54

Вы не используете >=, <= и т. д. В текстовых столбцах. Для поиска с использованием подстановочных знаков используйте НРАВИТЬСЯ

Mazhar 10.09.2018 09:54

При сравнении строк *, _, % - это просто символы. Между * и B применяются те же правила упорядочения, что и между A и B.

Panagiotis Kanavos 10.09.2018 09:55

Что бы вы ожидали, даже если бы звездочка была подстановочным знаком (а это не так)? '*' будет соответствовать 'A', а также 'Z' (а также любому другому символу или даже группе символов в этом отношении). Так будет ли «Хосе» до или после «* Эбби»? Это определенно после «AAbby» и до «ZAbby». Сравнение не имело бы никакого смысла, правда?

Thorsten Kettner 10.09.2018 10:10
1
5
4 719
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Это потому, что >= и <= являются операторами сравнения. Они сравнивают строку на основе своих значений ASCII.

Поскольку значение ASCII для * равно 42, а значения заглавных букв ASCII начинаются с 65, поэтому, когда вы попробовали name<='*Abby', sql-сервер выбрал значение ASCII первого символа в вашей строке (то есть 42), поскольку в ваших данных нет значения имеет первый символ со значением ASCII меньше 42, данные не выбраны.

Вы можете обратиться к таблице ASCII для большего понимания:

http://www.asciitable.com/

Нет, SQL Server использует сопоставления для определения порядка сортировки. Очень немногие сопоставления соответствуют правилам ASCII.

Damien_The_Unbeliever 10.09.2018 09:59

@Damien_The_Unbeliever прав. На некоторых сопоставлениях, например, 'B' > 'a', на других - 'B' < 'a'.

Larnu 10.09.2018 10:01
Ответ принят как подходящий

Подстановочные знаки интерпретируются только при использовании оператора LIKE.

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

1) Перед * нет букв, поэтому строки не возвращаются.

2) A - первая буква в алфавите, поэтому остальные имена - больше, затем Abby, только Abby равна самой себе.

3) Напротив 2)

4) См. 1)

5) См. 1)

6) Это условие эквивалентно Name = 'Abby'.

Подстановочный знак используется для замены любых других символов в строке. Они используются вместе с оператором SQL LIKE в предложении WHERE. Например.

Select * from thisTable WHERE name LIKE '%Abby%'

Это вернет любые значения с Эбби в любом месте строки.

Взгляните на эту ссылку для объяснения всех подстановочных знаков https://www.w3schools.com/sql/sql_wildcards.asp

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

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

Если мы добавим цифры, вы можете быть удивлены. Например, нить (важно, я не указывал номер) '123456789' имеет значение ниже, чем строка '9'. Это потому, что первый символ отличается от первого символа. '9' больше, чем '1', поэтому '9' имеет «более высокое» значение. Это одна из причин, по которой так важно сохранять числа как числовые типы данных, поскольку в противном случае поведение вряд ли будет тем, чего вы ожидаете / хотите.

Однако к тому, о чем вы спрашиваете, подстановочный знак для SQL Server - это '%' и '_' (есть также '^', m, но я не буду здесь останавливаться на этом). '%' представляет несколько символов, а '_' - один символ. Если вы хотите специально найти один из этих символов, вы должны указать их в скобках ([]).

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

Как я сказал ранее, если вы хотите найти одного из этих конкретных персонажей, тогда вы цитируете. Итак, если вы хотите найти строку, содержащую подчеркивание, синтаксис будет WHERE ColumnName LIKE '%[_]%'

Обновлено: также стоит отметить, что при использовании таких вещей, как LIKE, на них влияет чувствительность сопоставлений; например Кейс и Акцент. Если вы используете, например, сортировку с учетом регистра, то утверждение WHERE 'Abby' LIKE 'abb%' неверно, а 'A' и 'a' - разные случаи. Аналогично, утверждение WHERE 'Covea' = 'Covéa' будет ложным в сопоставлении с учетом акцента ('e' и 'é' не рассматриваются как один и тот же символ).

Есть несколько ответов и несколько комментариев - я постараюсь подвести итог.

Во-первых, подстановочный знак в SQL - это%, а не * (для нескольких совпадений). Итак, ваши запросы, включая *, требуют сравнения с этой буквальной строкой.

Во-вторых, сравнение строк с операторами «больше / меньше», вероятно, не дает того, что вы хотите - оно использует порядок сортировки, чтобы увидеть, какие другие строки являются «более ранними» или «более поздними» в последовательности упорядочивания. Порядок сортировки - это умеренно сложная концепция, которая варьируется в зависимости от установки машины.

Оператор SQL для сопоставления строкового шаблона - это LIKE.

Я не уверен, что понимаю ваше намерение в отношении заявлений >= или <= - вы имеете в виду, что хотите вернуть строки, в которых первая буква имени стоит после «A» в алфавите?

Другие вопросы по теме