编辑:
所以,似乎特别是我想要做的事情有些混乱,所以我要改变我的榜样。
我有一个名为example_table的表:
id code1 code2
-------------------------
1 1780 4245
2 1781 4280
3 1900 1200
4 2800 4217
5 2817 1782
有了这个,我想找到类似的东西,
SELECT * FROM example_table WHERE code1 LIKE '%17%' OR code2 LIKE '%17%';
我希望此返回
id code1 code2
------------------------
1 1780 null
2 1781 null
4 null 4217
5 2817 1782
所以你会注意到它会使任何与任一列不匹配的结果为空,如果两者都存在,它将同时获取两者。
答案 0 :(得分:5)
从字面上看,你可以这样做......
SELECT
first_name,
CASE WHEN last_name = 'Smith' THEN last_name ELSE maiden_name END
FROM
users
WHERE
last_name = 'Smith'
OR maiden_name = 'Smith'
但是,实际上,无论哪个领域匹配,它都将是'史密斯',所以为什么要这么做呢?只是这样做?
SELECT
first_name,
'Smith'
FROM
users
WHERE
last_name = 'Smith'
OR maiden_name = 'Smith'
编辑:根据您的编辑问题......
SELECT
id,
CASE WHEN code1 LIKE '%17%' THEN code1 ELSE NULL END AS code1,
CASE WHEN code2 LIKE '%17%' THEN code2 ELSE NULL END AS code2
FROM
example_table
WHERE
code1 LIKE '%17%'
OR code2 LIKE '%17%'
;
答案 1 :(得分:1)
此SQL代码应该为您执行
SELECT
A.id,B.code1,C.code2
FROM
(SELECT id FROM example_table) A
LEFT JOIN
(
SELECT id,code1 FROM example_table
WHERE code1 LIKE '%17%'
) B ON A.id=B.id
LEFT JOIN
(
SELECT id,code2 FROM example_table
WHERE code2 LIKE '%17%'
) C ON A.id=C.id
WHERE
ISNULL(B.code1) = 0 OR ISNULL(C.code1) = 0
;
我无法对其表现做出任何承诺。
如果您不介意将null作为字符串呈现,请尝试以下方法:
SELECT
id,
IF(code1 LIKE '%17%',code1,'null') code1,
IF(code2 LIKE '%17%',code2,'null') code2
FROM example_table WHERE
code1 LIKE '%17%' OR
code2 LIKE '%17%';
一次没有连接的全表扫描。这可能会更好。
答案 2 :(得分:0)
您可以使用UNION
SELECT first_name, last_name FROM users WHERE last_name='Smith'
UNION
SELECT first_name, maiden_name FROM users WHERE maiden_name='Smith';
使用CASE
语句或稍微不那么优雅:
SELECT first_name,
CASE WHEN last_name='Smith' THEN last_name
ELSE maiden_name END
AS last_name
FROM users where last_name='Smith' or maiden_name='Smith';
@Dems指出的可以简化为:
SELECT first_name, 'Smith' AS last_name
FROM users WHERE last_name='Smith' or maiden_name='Smith';
这引出了一个问题,你真的甚至在结果集中需要last_name
吗?调用者已经知道last_name
,因为它是查询的一部分。为什么不返回first_name
并且有一个非常简单易懂的查询?
SELECT first_name FROM users
WHERE last_name='Smith' or maiden_name='Smith';
答案 3 :(得分:0)
你的意思是
SELECT
first_name,
IF(last_name='Smith',last_name,concat(last_name,' (née ',maiden_name,')')) AS last_name
FROM
users
WHERE
users.last_name='Smith'
OR maiden_name='Smith'