0

我有一个如下表,它基本上用于为表中的值“命名”(该表还包含一堆其他表的值,而不仅仅是 MYTABLE;我省略了一些不相关的字段来自 NAMEVALUEMAP):

NAMEVALUEMAP Table
---------------------
VALUE_  | NAME_
---------------------
0       | ZERO
1       | ONE

我不想使用 JOIN,所以我想到了使用子查询。

问题是当 NAMEVALUEMAP 表中不存在值时,会显示 NULL。
而不是 NULL 我想显示来自 MYTABLE 的实际值(MYTABLE 将 ID 字段作为标识列并包含几行):

-- //Fine, prints word 'ZERO' when MYTABLE.ABC is 0
SELECT 
(SELECT NAME_ FROM NAMEVALUEMAP WHERE VALUE_ = (SELECT ABC FROM MYTABLE inner_ WHERE inner_.ID = outer_.ID))
FROM 
MYTABLE outer_

-- //Not Fine, prints NULL (because "999" is not in NAMEVALUEMAP). In this case, MYTABLE.ABC is 999
-- //Want it to print 999 if the value is not in NAMEVALUEMAP
SELECT 
(SELECT NAME_ FROM NAMEVALUEMAP WHERE VALUE_ = (SELECT ABC FROM MYTABLE inner_ WHERE inner_.ID = outer_.ID))
FROM 
MYTABLE outer_

-- //Tried COALESCE, but the error is "Invalid column name 'VALUE_'"
SELECT 
COALESCE((SELECT NAME_ FROM NAMEVALUEMAP WHERE VALUE_ = (SELECT ABC FROM MYTABLE inner_ WHERE inner_.ID = outer_.ID)), ABC)
FROM 
MYTABLE outer_

另外,有没有更好的方法来进行这种值到名称的映射?

4

3 回答 3

1

这是一个左连接,除非你想要一些 EXISTS/UNION 构造。未测试:

SELECT
    COALESCE(N.VALUE, M.ABC)
FROM
    MYTABLE M
    LEFT JOIN
    NAMEVALUEMAP N ON M.VALUE N.ABC

如果你真的想避免加入......

SELECT
    ABC
FROM
    MYTABLE M
WHERE
    NOT EXISTS (SELECT * FROM NAMEVALUEMAP N WHERE M.VALUE N.ABC)
UNION ALL
SELECT
    VALUE
FROM
    NAMEVALUEMAP N
WHERE
    EXISTS (SELECT * FROM MYTABLE M WHERE M.VALUE N.ABC)

编辑:

EXISTS 问题中的 SELECT *、1 或 NULL 再次出现

于 2009-12-19T09:02:39.343 回答
1

我建议使用LEFT JOIN(你有什么理由取消它吗?)和ISNULL

SELECT  ISNULL(NAME_, ABC)
FROM    MYTABLE m LEFT JOIN
    NAMEVALUEMAP n ON m.ABC = n.VALUE_

好吧,在这种情况下,您可以尝试

SELECT  ISNULL((select NAME_ FROM NAMEVALUEMAP WHERE VALUE_ = m.ABC), m.ABC)
FROM    MYTABLE m
于 2009-12-19T09:02:51.640 回答
0

编辑:

SELECT 
COALESCE(
   (SELECT NAME_ FROM NAMEVALUEMAP WHERE VALUE_ = 
      (SELECT ABC FROM MYINNERTABLE inner_ WHERE inner_.ID = outer_.ID)
   ),
   <int to string>(
      SELECT ABC FROM MYINNERTABLE inner_ WHERE inner_.ID = outer_.ID
   )
)

FROM 
MYTABLE outer_

其中列函数<int to string>适用于 sqlserver。在 mysql 中它将是 CAST()。如果不进行转换,查询将对不匹配的数据类型产生不稳定的影响。

于 2009-12-19T09:07:27.693 回答