Выбрать столбец на основе имени столбца, хранящегося в другой таблице - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь получить значение ячейки из другой таблицы (UserTable), для которой столбец ячейки указан в исходной таблице (DataTable).Значение ячейки будет использоваться для вычисления оценки, которая затем будет определять порядок результатов запроса.

UserTable:
+--------+------+------+------+
| userid | c1   | c2   | c3   |
+--------+------+------+------+
|    id1 |    0 |    1 |    1 |
|    id2 |    0 |    0 |    1 |
|    id3 |    1 |    0 |    0 |
|    id4 |    1 |    1 |    0 |
+--------+------+------+------+

DataTable:
+--------+------+------+------+
| id     | ColA | ColB | ColC |
+--------+------+------+------+
|      1 | A    | B    | c1   |
|      2 | D    | E    | c3   |
|      3 | G    | H    | c2   |
|      4 | J    | K    | c3   |
+--------+------+------+------+

Мой текущий, не работающий запрос:

SELECT *, 
       (SELECT DataTable.ColC 
        FROM UserTable 
        WHERE UserTable.userid = 'some_user_id') AS score 
FROM DataTable 
ORDER BY score DESC

Но при этом не выбирается соответствующий столбец в UserTable, а вместо этого возвращается строковое значение, содержащееся в ColC.

Ожидаемый результат: если для параметра some_user_id установлено, например, значение id2.Ожидаемый результат будет:

+--------+------+------+------+------+
| id     | ColA | ColB | ColC | score|
+--------+------+------+------+------+
|      2 | D    | E    | c3   |  1   |
|      4 | J    | K    | c3   |  1   |
|      1 | A    | B    | c1   |  0   |
|      3 | G    | H    | c2   |  0   |
+--------+------+------+------+------+

, где столбец оценки - это просто поиск значения из пользовательской таблицы.

Возможно ли решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018
Declare @expr nvarchar(max);  
Declare @value nvarchar(max);   
DECLARE db_cursor CURSOR  
FOR Select colC from dbo.DataTable;

OPEN db_cursor;  
FETCH NEXT FROM db_cursor INTO @value;  
Set @expr = 'Select ' + @value;  
WHILE @@FETCH_STATUS = 0  
BEGIN  
       Set @expr += ',' + @value  
       FETCH NEXT FROM db_cursor INTO @value;  
END;  
CLOSE db_cursor;  
DEALLOCATE db_cursor;  

EXEC (@expr + ' from dbo.UserTable')
0 голосов
/ 13 ноября 2018

Я хотел бы выразить это, отключив пользовательскую таблицу:

select dt.*, uts.score
from datatable dt left join
     ((select ut.userid, 'c1' as which, c1 as score
       from usertable ut
      ) union all
      (select ut.userid, 'c2' as which, c2 as score
       from usertable ut
      ) union all
      (select ut.userid, 'c3' as which, c3 as score
       from usertable ut
      ) 
     ) uts
     on dt.colc = uts.which 
where uts.userid = ?;

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

0 голосов
/ 13 ноября 2018

Вы не можете сделать это динамически. Но вы можете создать оператор CASE, который отображает имена столбцов в столбцы:

SELECT DataTable.*, (
    SELECT CASE DataTable.ColC
        WHEN 'c1' THEN UserTable.c1
        WHEN 'c2' THEN UserTable.c3
        WHEN 'c3' THEN UserTable.c3
    END
    FROM UserTable
    WHERE UserTable.userid = 'id2'
) AS score
FROM DataTable
ORDER BY score DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...