我正在处理一个小显示复杂功能。我确信我只是忽略了IF / ELSE功能。
我有2个表我正在查询(客户,地址)。第一个有主要记录,但第二个可能有也可能没有LEFT JOIN到的记录。
如果地址表中没有记录,我想显示零。 如果有记录,我想只显示1。
到目前为止我的尝试:
SELECT c.name, COALESCE(a.addressid,0) AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123
第一个例子没有这样做。但我可能错误地使用了COALESCE。
如果存在,我如何显示0,如果存在则显示1?
答案 0 :(得分:184)
而不是COALESCE(a.addressid,0) AS addressexists
,请使用CASE
:
CASE WHEN a.addressid IS NOT NULL
THEN 1
ELSE 0
END AS addressexists
或更简单:
(a.addressid IS NOT NULL) AS addressexists
这是有效的,因为TRUE
在MySQL中显示为1
,FALSE
显示为0
。
答案 1 :(得分:84)
SELECT c.name, IF(a.addressid IS NULL,0,1) AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123
答案 2 :(得分:16)
如果您来自C / C ++并期望这样做,请小心:
select if(name, 1, 0) ..
即使'name'不是NULL,与C不同,虚假条件仍会触发,上面的语句返回0.因此,您必须记住显式检查NULL或空字符串:
select if(name is null or name = '', 0, 1)
PS Eugen's example up above is correct,但我想澄清这种细微差别,因为它让我感到意外。
答案 3 :(得分:13)
SELECT
c.name,
CASE WHEN a.addressid IS NULL THEN 0 ELSE 1 END AS addressexists
FROM customers c
LEFT JOIN addresses a ON c.customerid = a.customerid
WHERE customerid = 123
答案 4 :(得分:2)
没有WHERE的另一种方法,试试这个..
将同时选择Empty和NULL值
SELECT ISNULL(NULLIF(fieldname,'')) FROM tablename
如果它是一个空字符串,它将设置为null,然后在该字符串上也为true。
答案 5 :(得分:0)
如果在TSQL中,您可以尝试:
SELECT IIF(a.addressid IS NULL, 0, 1) AS addressexists
SQL Server应该可以工作
答案 6 :(得分:0)
您实际上可以在最新版本的MySQL中使用IF语句。
IF(expr,if_true_expr,if_false_expr)
IE:
SELECT name, IF(ISNULL(name), 'robot', 'human') AS type
FROM visitors