2013-09-24 3 views
0

Я пытаюсь предоставить массив шестнадцатеричных кодов цвета для запроса, и мне нужно одно значение, выстроенное с каждым результатом, желательно с циклом списка цветов, если он заканчивается ,SQL Join hardcoded array to results 1-to-1

Я пытаюсь использовать unnest(ARRAY[]) с цветами, закодированными как 15-20 строк.

UNNEST(ARRAY['9A2849', '0F910F', 'A3915D', 'D49D2F', 'E87B00', 
    '09A6B3', '007DC3', '969696', '005788', '086908', '706545', 
    '996600', '801131', '606060', 'BA5004', '008596']) AS color 

Я не могу получить JOIN работать, так как они требуют ON пункта.

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

Есть ли простой способ добавить столбец жестко закодированных данных, которые выстраиваются в линию с 1 по 1 с выбранными данными? Если это так, можно ли сделать цикл жестко закодированных данных, когда достигнут его конец? (Если нет, то я могу ограничить выбор в 25 крупнейших результатов, так как больше будет ленточек на круговой диаграмме в любом случае.)

Результаты должны быть что-то вроде:

value | label     | color 
----------------------------------------- 
2  | "A test for cloning" | "9A2849" 
6  | "Automobile Bays"  | "0F910F" 
2  | "Break Rooms"   | "A3915D" 
3  | "Common Areas"  | "D49D2F" 
+0

Похоже, вы хотите, левый, правый или полное объединение, а не внутреннее соединение. –

+0

Я просто попробовал 'CROSS JOIN', и он просто дал мне первое значение из массива для каждой строки моих результатов. Насколько мне известно, все остальные 'JOIN' требуют условия« ON »и какое условие я могу использовать? –

+1

С какими данными вы начинаете? –

ответ

3

Как об использовании номер строки% количество цветов, у вас есть и вступление в том, что:

SELECT * 
FROM (SELECT *, row_number() OVER(ORDER BY numb DESC) AS POSITION FROM tab) t 
JOIN (SELECT UNNEST(ARRAY['9A2849', '0F910F', 'A3915D', 'D49D2F', 'E87B00','09A6B3', '007DC3', '969696', '005788', '086908', '706545', 
    '996600', '801131', '606060', 'BA5004', '008596']) AS color, UNNEST(ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]) AS numb 
    ) x 
ON t.POSITION % 16 + 1 = x.numb; 

http://www.sqlfiddle.com/#!1/00823/3

из комментария Му:

SELECT (ARRAY['9A2849', '0F910F', 'A3915D', 'D49D2F', 'E87B00','09A6B3', '007DC3', '969696', '005788', '086908', '706545', 
    '996600', '801131', '606060', 'BA5004', '008596'])[t.position% 16 + 1] AS color, * 
FROM (SELECT *, row_number() OVER(ORDER BY numb DESC) AS POSITION FROM tab) t 

http://www.sqlfiddle.com/#!1/00823/10

+2

. Для этого вам даже не нужен JOIN/UNNEST, вы можете сказать такие вещи, как 'select ... (array [.. .]) [n% 16 + 1] from (выберите *, row_number() over ...) 'и переместите массив, переходящий во внешний SELECT. –

+0

@muistooshort Это было бы лучше, но я не могу сделать эту работу. Что такое синтаксис? –

+2

Что-то вроде этого: 'select value, label, (ARRAY [...]) [n% 16 + 1] from (выберите значение, label, row_number() over() как n из T) как dt'. Просто заполните условия заказа и содержимое ARRAY, сложная часть - обматывание литерала массива в круглых скобках. –