mysql, где точное совпадение - PullRequest
3 голосов
/ 20 декабря 2011

Когда я пишу этот запрос

SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 260;

return

title            city  
---------------  ------
Butterfly world  Mohali

и когда я пишу

SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = '260abcxyz';

return

title            city  
---------------  ------
Butterfly world  Mohali

видите, второй не прав.я хочу получить значение только если ID точно совпадает ... как решить эту проблему.спасибо за вашу помощь.

Ответы [ 4 ]

3 голосов
/ 20 декабря 2011

Вы можете преобразовать id в строку, чтобы сравнение было выполнено точно. Вы можете использовать LIKE, чтобы вызвать неявное преобразование

SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id LIKE '260abcxyz';

или альтернативно, вы можете выполнить приведение явно

SELECT cd.title, cd.city FROM coupon_detail cd WHERE CAST(cd.id AS CHAR) = '260abcxyz';

Однако, если все ваши идентификаторы являются целыми числами, вероятно, более целесообразно проверить эти значения, прежде чем пытаться выполнить запрос к базе данных. (Если идентификатор, с которым вы запрашиваете, не является номером, совпадение все равно не может быть.)

2 голосов
/ 20 декабря 2011

Ну, вы не должны использовать кавычку, если id равен INT.MySQL делает это так: если вы используете String для сравнения INT, он использует только начальное целое число от начала.

посмотрите это:

mysql> desc coupon_detail;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| title | varchar(100) | YES  |     | NULL    |       |
| city  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.04 sec)

mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 'ff260';
Empty set, 1 warning (0.00 sec)

mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = '260ff';
+-----------------+--------+
| title           | city   |
+-----------------+--------+
| Butterfly world | Mohali |
+-----------------+--------+
1 row in set, 1 warning (0.00 sec)

mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 260;
+-----------------+--------+
| title           | city   |
+-----------------+--------+
| Butterfly world | Mohali |
+-----------------+--------+
1 row in set (0.00 sec)

mysql> SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id = 26011;
Empty set (0.00 sec)

Идея состоит не в том, чтобы смешивать числаафабец для сравнения столбца INT.Если вам нужно, вы можете

  • преобразовать столбец ID в VARCHAR.В этом случае автоинкремент может исчезнуть.
  • имеет логику приложения для запроса только тех строк, которые имеют цифры.
2 голосов
/ 20 декабря 2011

Это происходит из-за преобразования типов в MySql. Мой sql рассматривает '260abcxyz' как целое число в вашем запросе, и AFAIK, потому что первый символ - это число. MySql преобразует его в число, и оно становится только 260, и поэтому вы получаете результат. Если вы сначала напишите символ вроде abcxyz260, то сравнение будет успешным.

Более подробное объяснение доступно здесь: Преобразование типов в MySql

В качестве решения: вам следует позаботиться о том, чтобы в сравнении передавались только цифры, а не комбинация строки и числа.

0 голосов
/ 20 декабря 2011

используйте вместо этого как =, потому что, если строка слишком длинная, точное совпадение не будет работать таким образом
SELECT cd.title, cd.city FROM coupon_detail cd WHERE cd.id LIKE '260abcxyz';

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