LIKE 'x%' работает, но LIKE '% x' не работает на INT, преобразованном в STRING - PullRequest
0 голосов
/ 23 октября 2018

Я обнаружил это странное поведение и искал, но ничего не смог найти.Я знаю, что в моем примере мне не нужно приводить [affairenum] к STRING, но из-за особого синтаксиса в Entity Framework это способ генерирования Affairenum.Contains(), StartsWith() или EndsWith().

Рассмотрим, например, таблицу, которая содержит идентификатор (столбец affaireid) и числа (столбец affairenum) со значениями от 1 до 5000000.

SELECT TOP (1000) [affaireid]
      ,[affairenum]
      ,STR(affairenum) AS string
  FROM [dbo].[ULAffaire]
where STR(affairenum) LIKE N'%9'

Работает и возвращает результаты.То же самое касается N'%9%'.

SELECT TOP (1000) [affaireid]
      ,[affairenum]
      ,STR(affairenum) AS string
  FROM [Ulysse].[dbo].[ULAffaire]
where STR(affairenum) LIKE N'9%'

Не работает и ничего не возвращает.Разница здесь LIKE N'9%', эквивалент StartsWith().

STR(affairenum) выглядит идентично affairenum, EndsWith() и Contains(), оба работают нормально, но это ничего не возвращает.

Я пробовал с LOWER(), но безрезультатно.Метод STR() добавляет что-нибудь?пробел, какой-то странный персонаж?Я что-то упускаю глупо?

1 Ответ

0 голосов
/ 23 октября 2018

Это потому, что str() оставил результаты с пробелами.По умолчанию длина 10 (см. здесь ).

Я не фанат использования чисел в качестве строк.Но если вы сделаете это, явное преобразование должно сделать то, что вы хотите:

where cast(affairnum as varchar(255)) like '9%'

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

Следует отметить, что вам даже не нужно явно преобразовывать число в строку, поэтому это работает:

where affairnum like '9%'

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

...