Почему этот оператор TSQL LIKE не всегда находит запятые? - PullRequest
0 голосов
/ 31 августа 2018

Я ожидаю, что это присоединится, когда ApptIdList равен «12345», и не присоединится, когда ApptIDList будет «12345,67890»

SELECT *
FROM WAITINGROOM a
LEFT JOIN APPOINTMENTS b on b.ApptId = (CASE WHEN (a.ApptIdList LIKE '%,%') THEN -1 ELSE CONVERT(INT, a.ApptIdList) END)

Столбец WAITINGROOM.ApptIdList представляет собой список строк, разделенных запятыми, который соответствует ключу int APPOINTMENTS.ApptId

(Да, я знаю, что это плохой способ создания базы данных. Это не моя база данных, и я не могу ее изменить.)

Это похоже на мою копию базы данных, но в некоторых базах данных пользователя выдает ошибки типа

Преобразование не удалось при преобразовании значения varchar '236656,236655' в тип данных int

Мне кажется, что на некоторых машинах '236656,236655' LIKE '%,%' ложно, что меня очень удивляет, и я не нашел способа воспроизвести это поведение на моей машине. Это вообще возможно? Или здесь происходит что-то еще более странное?

Я использую SQL Server 2008 R2. У пользователей есть различные версии, все 2008 R2 или выше.

1 Ответ

0 голосов
/ 31 августа 2018

сделать преобразование в другом направлении:

SELECT *
FROM WAITINGROOM wr LEFT JOIN
     APPOINTMENTS a
     ON wr.ApptIdList + ',' LIKE CAST(a.ApptId as VARCHAR(255)) + ',%';

С преобразованием в этом направлении нет опасности того, что преобразование будет ошибочным.

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