Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Функция за разделяне в SQL Server 2008

Първо, най-доброто решение е да не съхранявате данни в разделен със запетая списък във вашата база данни. Трябва да помислите за коригиране на структурата на таблицата.

Ако не можете да промените структурата на таблицата, тогава ще трябва да разделите данните в списъка на редове, за да присвоите правилното име. След като данните се разделят, можете да ги свържете обратно в списъка.

Има много различни разделяне функция, която можете да намерите онлайн, но ето версия, която обикновено използвам:

СЪЗДАВАНЕ НА ФУНКЦИЯ [dbo].[Split](@String varchar(MAX), @Delimiter char(1)) връща @temptable TABLE (items varchar(MAX)) като начало декларира @idx int declare @slice. varchar(8000) изберете @idx =1, ако len(@String)<1 или @String е нула, връщане, докато @idx!=0 начало set @idx =charindex(@Delimiter,@String) ако @idx!=0 set @ slice =left(@String,@idx - 1) else set @slice =@String if(len(@slice)>0) вмъкнете в @temptable(Items) стойности(@slice) set @String =right(@String, len(@String) - @idx) ако len(@String) =0 прекъсване край връщане край; 

За да получа вашия резултат, бих започнал с прилагане на split функция и номер_ред() тъй като не виждам уникален ключ, свързан с всеки ред. Ако имате уникален ключ на всеки ред, тогава няма да имате нужда от row_number() :

;с cte as( изберете rn, име, идентификатор от ( изберете row_number() над (подредете по (изберете 1)) rn, име на база данни от таблица2 ) t2 кръстосано приложи dbo.split(t2.databasename, ' ,') i таблица за вътрешно свързване1 t1 на i.items =t1.id) изберете *от cte 

Тази заявка разделя вашия списък, разделен със запетая, на следното:

<предварителен код>| RN | ИМЕ | Идентификатор |-------------------| 1 | MSSQL | 1 || 1 | Oracle | 3 || 2 | MySQl | 2 || 3 | MSSQL | 1 || 3 | MySQl | 2 |

След като имате данните в няколко реда с правилното name , тогава можете да използвате STUFF() и ЗА XML ПЪТ за да го свържете в списъка. Пълната ви заявка би била подобна на тази:

;с cte as( изберете rn, име, идентификатор от ( изберете row_number() над (подредете по (изберете 1)) rn, име на база данни от таблица2 ) t2 кръстосано приложи dbo.split(t2.databasename, ' ,') i вътрешна таблица за свързване1 t1 на i.items =t1.id) изберете STUFF( (SELECT ', ' + c2.name ОТ cte c2 където c1.rn =c2.rn подредете по c2.id ЗА XML ПЪТ (' ')) , 1, 1, '') Име на база данни от cte c1group от c1.rnorder by c1.rn; 

Вижте SQL Fiddle с демонстрация.

Резултатът от пълната заявка е:

<предварителен код>| ИМЕ НА БАЗА ДАННИ |-----------------| MSSQL, Oracle || MySQl || MSSQL, MySQl |

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преименувайте SA акаунта в SQL Server (пример за T-SQL)

  2. Проверете дали дадена таблица има външен ключ в SQL Server с OBJECTPROPERTY()

  3. Как да използвам псевдоним в клаузата where?

  4. Как да извлека десетични знаци при закръгляване на средна стойност в SQL

  5. Как да настроите Spotlight Cloud и ефективно да отстраните неизправности на SQL сървър