SQLite сложно, если присоединиться - PullRequest
3 голосов
/ 03 августа 2011

У меня есть следующие две таблицы:

T1 (id, name) T2 (id, hybrid_col)

Что я хочу сделать, это выбрать все из T2 и JOIN с T1, если hybrid_colявляется числовымПо сути, hybrid_col содержит ссылку на идентификатор T1 (в этом случае я хочу получить имя от T1) или текстовую строку (в этом случае я просто хочу hybrid_col).

Как я могу это сделать, пожалуйста?

Спасибо.

Ответы [ 4 ]

1 голос
/ 04 августа 2011

Если я правильно понял, это должно быть:

SELECT
(
  CASE 
     WHEN T2.HYBRID_COL = T1.ID THEN T1.NAME
      ELSE T2.HYBRID_COL
   END
) AS COLUMN
T2, T1
WHERE T2.ID = T1.ID
and ISNUMERIC(T1.HYBRID_COL ) = 1

Редактировать: Не знаю, искали ли вы ISNUMERIC, потому что T1.ID является числовым, если это так, просто удалите and ISNUMERIC(T1.HYBRID_COL ) = 1, это должно работать в любом случае, потому что выбор проверяет, что T2.HYBDRID_COL соответствует T1.ID

1 голос
/ 04 августа 2011

Другой подход - просто объединить два случая:

SELECT id, hybrid_col
FROM T2
WHERE hybrid_col+0!=hybrid_col
UNION
SELECT T2.id,t1.name
FROM T2 INNER JOIN T1 ON T2.hybrid_col=T1.id;

Нет необходимости проверять, является ли hybrid_col числовым, если оно совпадает с T1.ID. Если T1.ID всегда числовой, нечисловые значения будут исключены из объединения.

РЕДАКТИРОВАТЬ: Чтобы отсортировать их, инкапсулировать результат и сортировать это:

SELECT ID, VALUE
FROM
(
    SELECT id as "ID", hybrid_col as "Value"
    FROM T2
    WHERE hybrid_col+0!=hybrid_col
    UNION
    SELECT T2.id as "ID",t1.name as "Value"
    FROM T2 INNER JOIN T1 ON T2.hybrid_col=T1.id
) Q
ORDER BY ID;

Существуют и другие способы, такие как передача результата во временную таблицу и запрос к нему, но приведенный выше, вероятно, самый простой подход с одним запросом.

0 голосов
/ 04 августа 2011

Это должно работать без использования ISNUMERIC (который недоступен в SQLite)

SELECT IFNULL(T1.name, T2.hybrid_col) AS [name]
FROM T2
    LEFT OUTER JOIN T1 ON CAST(T1.id AS VARCHAR) = T2.hybrid_col

Это должно сработать для вас, но из-за приведенного типа вы, скорее всего, потеряете любые выгоды от индексации, которые вы могли бы получить в T1.id

0 голосов
/ 03 августа 2011

Попробуйте один раз

select id,
(case when ISNUMERIC(hybrid_col) = 1 then name
else hybrid_col end) as custom_col
from
(select T2.id,T2.hybrid_col,T1.name from T2 left join T1 on T2.id = T1.id) mytab
...