我有一个名为“users”的表格,其中有4个字段:ID,UNAME,NAME,SHOW_NAME。
我希望将此数据放入一个视图中,这样如果未设置SHOW_NAME,则应选择“UNAME”作为“NAME”,否则选择“NAME”。
我当前的查询:
SELECT id AS id, uname AS name
FROM users
WHERE show_name != 1
UNION
SELECT id AS id, name AS name
FROM users
WHERE show_name = 1
这通常有效,但它似乎失去了主键(NaviCat告诉我“users_view没有主键......”) - 我觉得这很糟糕。
有更好的方法吗?
答案 0 :(得分:1)
那应该没问题。我不确定为什么抱怨丢失主键。
我会提供一条建议。如果知道您的联盟中没有重复内容(例如when x = 1
和when x != 1
这两个部分),则应使用union all
。
union
子句将尝试删除重复项,在这种情况下,这会浪费时间。
如果您需要更有针对性的帮助,最好发布视图和基础表的详细信息。视图本身不具有主键或索引,而是依赖于基础表。
因此,这可能是您的“NaviCat”产品(无论 )期望看到主键(换句话说,它不能很好地构建视图)的问题。
答案 1 :(得分:1)
如果我正确理解你的问题,你应该只能使用下面的CASE语句作为你的逻辑
SELECT
CASE WHEN SHOW_NAME ==1 THEN NAME ELSE UNAME END
FROM users
答案 2 :(得分:1)
这可能更好地写成如下:
SELECT id AS id,IF(show_name == 1,name,uname)AS名称 来自用户