2012-06-04 1 views
0

У меня есть запрос, который выглядит следующим образом:Преобразование текста в целое во время регистрации (кастинг?)

SELECT p.prodname, p.prodcode, o.vovalue, p.productid, i.imageprodid, c.vcstock, p.prodcatids, t.catname 
FROM isc_products p 
LEFT OUTER JOIN isc_product_variation_combinations c ON c.vcproductid = p.productid 
LEFT OUTER JOIN isc_product_variations v ON v.variationid = c.vcvariationid 
LEFT OUTER JOIN isc_product_variation_options o ON o.voptionid = c.vcoptionids 
LEFT OUTER JOIN isc_product_images i ON i.imageprodid = p.productid 
LEFT OUTER JOIN isc_categories t ON t.categoryid = p.prodcatids 
WHERE c.vcstock >1 
AND i.imageprodid IS NULL 
ORDER BY ca.catname 

Я пытаюсь получить название категории (t.catname) в колонке. Возвращает значение NULL из-за присоединения t.categoryid = p.prodcatids.

p.prodcatids - это текст (utf8_general), а t.categoryid - int (11).

Как преобразовать (cast?) P.prodcatids как int11, чтобы он присоединился к t.categoryid?

ответ

2
CAST(p.prodcatids AS UNSIGNED) 

должны сделать работу

2

Просто пару нот.

Тот факт, что вы можете сделать бросок, чтобы получить желаемый результат, не является заменой правильной структуры данных. Вы должны иметь все внешние ключи того же типа, что и первичные ключи. В частности, это наносит ущерб оптимизатору запросов и, как правило, гарантирует объединение вложенного цикла (наименее эффективный вид).

Кроме того, если вам предоставлена ​​такая ситуация, то, как правило, более точная конверсия в сторону от символьного типа данных. Это связано с тем, что функция трансляции не может точно соответствовать другому полю. Например, «100» не равно «100,00».

Однако это вводит возможность отказа в литье. Некоторые базы данных, такие как SQL Server, предлагают такие функции, как isnumeric и isdate для обработки этой ситуации. Другие нет.

Смежные вопросы