SQL: как выбрать строки со значениями, равными тысячам (1 столбец может содержать несколько значений) - PullRequest
0 голосов
/ 26 марта 2020

Не могли бы вы помочь мне выбрать строки, которые содержат хотя бы 1 значение в диапазоне от 1000 до 1999. У меня есть столбец (nvarchar (255):

col1

5501, 3500
3001, 3050, 4020
 1030, 1010, 1043, 2000
 3010, 1420, 8000, 2044
 1330, 1330, 8000, 3111
 1333, 1132, 8000, 1332

Желаемый результат:

1030, 1010, 1043, 2000
 3010, 1420, 8000, 2044
 1330, 1330, 8000, 3111
 1333, 1132, 8000, 1332

Я пытался использовать самописанную функцию splitstring:

ALTER FUNCTION [dbo].[fn_splitstring] ( @stringToSplit VARCHAR(MAX) )
RETURNS
 @returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN

 DECLARE @name NVARCHAR(255)
 DECLARE @pos INT

 WHILE CHARINDEX(',', @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(',', @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @returnList 
  SELECT @name

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 INSERT INTO @returnList
 SELECT @stringToSplit

 RETURN
END

и string_agg(), но она работает только с одной строкой.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Для вашей конкретной проблемы вы можете использовать LIKE. Предполагая, что все значения состоят из четырех символов (как в вашем примере):

where codes like '%1[0-9][0-9][0-9]%'

Или:

where ' ' + codes like '% 1%'

Примечание. Исправьте модель данных! Не храните числа в строках! Не храните несколько значений в виде строк!

0 голосов
/ 26 марта 2020

Вот решение:

    select * from table s
    where exists (select * from cmn.dbo.fn_splitstring(s.codes,', ') c 
where convert(int,c.item) between 1000 and 1999)

Где cmn.dbo.fn_splitstring описано выше.

...