Почему MS SQL Server возвращает результаты с запросом «LIKE», но возвращает пустой набор с помощью «=» - PullRequest
0 голосов
/ 15 апреля 2019

Я использую MS SQL Server 2017. В этом примере у меня есть таблица [myTable] с одной сущностью full name (varchar(255).

Внутри этой таблицы у меня импортирована одна масса записей со следующими параметрами

(FIELDTERMINATOR = '~',
 ROWTERMINATOR = '0x0A' )

Следующий запрос возвращает одну запись:

SELECT [full name]
FROM myTable
WHERE [full name] LIKE '%LastName%'

Однако следующий запрос не выполняет:

SELECT [full name]
FROM myTable
WHERE [full name] = 'Firstname Lastname'

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

SELECT [full name]
FROM myTable
WHERE [full name] = 'Firstname Lastname ' 

чтобы убедиться, что в конце столбца не было случайного пробела. Что может вызвать проблему как это?

Ответы [ 4 ]

0 голосов
/ 15 апреля 2019

В mssqltips приведен совет, в котором говорится, что вы можете использовать SSIS. В статье также объясняется эта проблема, возникающая с ROWTERMINATOR. С учетом сказанного я хотел бы создать проект служб SSIS, содержащий пакет, который выполняет массовую вставку данных из источника данных. Если это повторяющийся процесс, его можно запланировать или быстро проверить в SSMS.

Если вы новичок в службах SSIS или не знакомы с службами SSIS, см. Здесь: Службы интеграции SQL Server

0 голосов
/ 15 апреля 2019

LIKE, как предполагает само название, в основном используется для сравнения данных какой-либо формы, в которой форма в основном regular expressions

, тогда как

= находит только точнуюне совпадать с тем, что они должны иметь какую-то форму, а данные слева от = должны быть кристально чистой копией того, что справа от них.

Например.

В соответствии с приведенным выше примером ввода ..where fullname LIKE %FirstName%.В целом это будет означать выбор данных. Где полное имя содержит имя

Если я заменим это % ...where fullname LIKE FirstName, тогда оно будет таким же, как ...where fullname = FirstName, потому что здесь требуется точное совпадение, а не данные какой-либо формы.

0 голосов
/ 15 апреля 2019

У меня есть удобный скрипт, который я использую для идентификации невидимых символов;он дает вам каждый символ в строке, но в виде отдельной строки для каждого символа.

DECLARE @nstring NVARCHAR(1000)

select top 1 @nstring = [full name]
FROM myTable
WHERE [full name] LIKE '%LastName%'

print @nstring

DECLARE @position INT
 SET @position = 1

DECLARE @CharList TABLE (
 Position INT,
 UnicodeChar NVARCHAR(1),
 UnicodeValue INT
 )

WHILE @position <= DATALENGTH(@nstring)
 BEGIN
 INSERT @CharList
 SELECT @position as Position
 ,CONVERT(nchar(1),SUBSTRING(@nstring, @position, 1)) as UnicodeChar
 ,UNICODE(SUBSTRING(@nstring, @position, 1)) as UnicodeValue
 SET @position = @position + 1
 END

SELECT * FROM @CharList
0 голосов
/ 15 апреля 2019

Оператор = работает только при точном совпадении

но Оператор LIKE используется в для поиска указанного шаблона в данных.

так что в вашем случае ваше сравниваемое значение напрямую не сопоставляется со значениями столбца, поэтому оно не возвращает никаких строк, а в моменты, когда оно соответствует шаблону, поэтому оно возвращает строки

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