Запрос SQL - извлечение данных из одного столбца, разделенных запятой, и отображение их по строке - PullRequest
0 голосов
/ 25 апреля 2018

У меня проблема с извлечением данных, разделенных запятой. Я хочу

Вот моя проблема

Table
ID | TDNO | PREVIOUS_TD |
1  | 14   | 13,12,11    |
2  | 23   | 45,12       |
3  | 32   | 89          |
4  | 55   | NEW         |

Я хочу получить такой результат. Пример, когда пользователь выберет 14 в TD, результат должен быть таким:

ID | TD  |
1  | 14  |
2  | 13  |
3  | 12  |
4  | 11  |

И когда пользователь выберет 32 в TD, результат должен быть таким:

ID | TD  |
1  | 32  |
2  | 89  |

когда пользователь выберет 23, результат должен быть таким:

ID | TD  |
1  | 23  |
2  | 45  |
3  | 12  |

как этого добиться?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Чтобы создать базу данных, вам нужно создать новую таблицу, которая имеет Id Td и tdNos и имеет отношения с этим. например:

Table TdNos
ID | TDNO | PREVIOUS_TD |
1  | 14   | 13,12,11    |
2  | 23   | 45,12       |
3  | 32   | 89          |
4  | 55   | NEW         |

Table TdNoHistory
TdID|Priority| PREVIOUS_TD |
1   |   1    |      13     |
1   |   2    |      12     |
1   |   3    |      11     |
2   |   1    |      45     |
2   |   2    |      12     |
3   |   1    |      89     |

Что для второй таблицы комбинация TdId и Priority является первичным ключом и имеет отношение с таблицей TdNos через столбец TdId

0 голосов
/ 25 апреля 2018

Вы можете попробовать хранимую процедуру или функцию в вашей версии SQL. Это псевдокод MySql, и он может быть очень ошибочным. Некоторые разновидности SQL не поддерживают возвращаемые таблицы:

    create function returnCommaSepList (IN myId INT)
    begin
        --
        -- is mtId in the source table?
        SET @previousTD = (
            select PREVIOUS_TD 
            from TheTable
            where ID = myId
        )

        --
        -- if the result is NULL then id was not in the table, return
        if @previousTD IS NULL then return

        --
        -- create a temporary table
        create table #temp (
            id INT primary key autoincrement,
            td int
        )

        --
        -- add myId to the temp table
        insert into #temp (td) values(myId)

        --
        -- prepare to do the string handling.  Step through 
        -- @previousTD looking for commas
        SET @startPos = 0
        SET @commaPos = LOCATE(',', @previousTD, @startPos)

        --
        -- @commaPos will be NULL if the string is NULL
        if @commaPos IS NULL then return

        --
        -- @commaPos will be 0 if there are no commas in the string
        if @commaPos = 0 then 
            SET @previousTD = TRIM(@previousTD)

            --
            -- if @previousTD is empty then return
            if LENGTH(@previousTD) = 0 then return

            --
            -- @previousTD has something in it that is not a comma. 
            -- try to insert it and return
            insert into #temp (td) values(@previousTD)
            select * from #temp order bu id
            return
        endif

        --
        -- should have a @previousTD with at least 1 comma
        while @commaPos > 0
        begin
            SET @item = substring(@previousTD, @startPos, @commaPos)

            insert into #temp (td) values(TRIM(@item))

            SET @startPos = @commaPos + 1
            SET @commaPos = LOCATE(',', @previousTD, @startPos)
        end

        select * from #temp order bu id
    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...