Как преобразовать varchar в числовой для использования в предложении WHERE - PullRequest
3 голосов
/ 15 марта 2019

У меня есть эта таблица, в которой хранится информация о сотруднике. Тип данных Id - это bigint. Теперь в коде, когда разработчик отправляет мне идентификаторы для извлечения данных, он отправляет мне в строковом формате, поскольку, очевидно, он не может передать это 453, 454 в целочисленное поле. Есть ли в любом случае, чтобы преобразовать это в bigint, чтобы я мог использовать это в оператор IN.

DECLARE @string varchar(25) = '453, 454'
SELECT FirstName+' '+LastName Employee FROM Employee WHERE ID IN (CAST(@string AS BIGINT))

Когда я запускаю этот запрос, я получаю следующую ошибку. Надеюсь, кто-нибудь может помочь.

Msg 8114, Level 16, State 5, Line 2
Error converting data type varchar to bigint.

Ответы [ 3 ]

5 голосов
/ 15 марта 2019

Вы должны серьезно избегать хранения данных CSV в таблицах SQL, поскольку они представляют собой ненормализованные данные. Тем не менее, есть способ, которым мы можем написать ваш запрос даже с данными CSV, используя небольшую коррекцию к данным в @string:

DECLARE @string varchar(25) = '453,454';

SELECT
    FirstName + ' ' + LastName Employee
FROM Employee
WHERE ',' + @string + ',' LIKE '%,' + CONVERT(varchar(10), ID) + ',%';

Демо

Хитрость заключается в том, чтобы преобразовать ваш входной CSV 453,454 в следующий код:

,453,454,

Затем мы просто ищем %,ID,% в этой измененной строке CSV.

3 голосов
/ 15 марта 2019

Попробуйте это

DECLARE @string varchar(25) = '453, 454';

SELECT FirstName + ' ' + LastName as Employee 
FROM Employee AS E
JOIN STRING_SPLIT(@string, ',') AS S
    ON S.value = E.ID

Демо здесь: (спасибо Тиму Бигелайзену)

0 голосов
/ 15 марта 2019

Я проверил мой следующий запрос в db2, он работал для меня. Столбец ORDEREXECUTED, изначально имеющий тип INTEGER, я могу вставить предложение where: У меня это сработало:

SELECT ORDEREXECUTED, CAST(ORDEREXECUTED AS INTEGER), CAST(ORDEREXECUTED AS VARCHAR) FROM DATABASECHANGELOG WHERE CAST(ORDEREXECUTED AS VARCHAR)='2';

Пожалуйста, смотрите ниже снимок экрана: ORDEREXECUTED column having type INTEGER type

Вывод для вышеуказанного запроса:

enter image description here

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