我有一个名为category的简单数据库表:
category.id category.name category.lang
1 'apple' 'en'
1 'manzana' 'es'
1 '' 'de'
1 '' 'it'
变量:
$default_lang = 'en';
$current_lang = 'it';
我想根据$ current_lang进行返回category_name字段的查询,但如果category.name为空,则应使用$ default_lang中的category.name,如下所示:
SELECT * FROM cat_list
LEFT JOIN category ON cal_list.id = category.id
AND IF(category.name = $current_lang = '', $default_lang, 'No Lang')
请告诉我,如何修复此查询以使其正常工作?
===
好的,现在我有个好主意:
SELECT * FROM cat_list LEFT JOIN category
ON cal_list.id = category.id
AND category_lang IN ($curreng_lang, $default_lang)
AND category_name <> ''
它工作正常,但如果两种语言都有名称值,我应该担心“IN”顺序吗?
答案 0 :(得分:2)
SELECT catname=
CASE name
WHEN '' THEN (select name from Category where lang=$default_lang limit 1)
ELSE name
END
FROM Category where id=$current_lang
阐释: 这里查询是在select statment中使用case语句, 哪里 外部查询使用条件“id = $ current_lang”
所以在select语句中它将具有name ='',因此对于
catname=
CASE name
WHEN '' THEN (select name from Category where lang=$default_lang limit 1)
ELSE name
END
name是'',所以第一个条件应该执行when 这里它将执行查询
(从类别中选择名称,其中lang = $ default_lang limit 1) 返回名称apple(因为语言是'en') 这将是catname变量。将在结果中返回
如果它第一次获得名称的值(id = $ current_lang),它将随之返回。
答案 1 :(得分:2)
category.name
NULL 或是否为空字符串?
如果 NULL ,请使用COALESCE
(返回列表中的第一个非NULL值)
SELECT category.id,
COALESCE(category.name, $default_lang) name,
COALESCE(category.lang, $current_lang) lang
FROM cat_list
LEFT JOIN category
ON cal_list.id = category.id
如果空字符串,请使用IF
SELECT category.id,
IF(category.name = '', $default_lang,category.name) name,
IF(category.lang = '', $current_lang,category.lang) lang
FROM cat_list
LEFT JOIN category
ON cal_list.id = category.id
答案 2 :(得分:0)
user1664869, 怎么样?
SELECT catname=CASE c1.name
WHEN '' THEN c2.name
ELSE c1.name
END
FROM
Category c1
INNER JOIN Category c2 ON c1.lang=$current_lang and c2.lang=$default_lang;