Как написать SQL-запрос, где предложение WHERE использует подстроку, приведенную к long? - PullRequest
0 голосов
/ 10 марта 2019

В таблице, называемой «учетные записи», есть идентификатор учетной записи, представляющий собой строку длиной 13 символов, где первые 8 цифр представляют собой идентификатор пользователя, которому принадлежит эта учетная запись. Как запросить в базе данных целое число и проверить только первые 8 символов?

Я пытался сделать что-то вроде этого:

SELECT * FROM networthr.accounts WHERE CAST(SUBSTRING(account_id, 0, 8) as long) = 1;

Но он даже не позволит мне выполнить этот запрос.

Ответы [ 3 ]

1 голос
/ 10 марта 2019

По вашему запросу есть 2 проблемы:
1) Второй аргумент SUBSTRING() должен быть 1 (индекс равен 1, а не 0)
2) Вы должны привести к типу данных UNSIGNED

SELECT * FROM networthr.accounts WHERE CAST(SUBSTRING(account_id, 1, 8) as unsigned ) = 1;
1 голос
/ 10 марта 2019

Это похоже на плохой дизайн. Однако - если account_id заполнен нулями, как "00000001ABCDE", и у вас есть индекс, эффективный способ будет

SELECT *
FROM networthr.accounts
WHERE account_id LIKE CONCAT(LPAD(?, 8, 0), '%')

Замените ? на user_id или используйте его в качестве подготовленного оператора и свяжите user_id в качестве параметра.

В случае user_id = 1 это то же самое, что

WHERE account_id LIKE '00000001%'
0 голосов
/ 10 марта 2019

Вы можете использовать неявное преобразование:

WHERE LEFT(account_id, 8) + 0 = 1

Однако вы действительно должны сравнивать строки со строками.

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