Помогите с форматированием строки в SQL Server Query - PullRequest
1 голос
/ 02 сентября 2010

У меня следующий запрос SQL:

ВЫБЕРИТЕ DISTINCT ProductNumber, PageNumber FROM table

Я пытаюсь изменить запрос, чтобы PageNumber был отформатирован. Видите ли, PageNumber имеет любой из следующих форматов, где «x» является цифрой:

  • ххх, ххх
  • ххх
  • ххх-ххх
  • хх, ххх-ххх
  • хх-хх, ххх
  • хх-хх, ххх-ххх

Я хочу отформатировать PageNumber так, чтобы он был только в формате: xxx . Для этого я разобрал следующие жирные цифры из вышеуказанных форматов:

  • ххх , ххх
  • ххх
  • ххх -xxx
  • xx , xxx-xxx
  • xx-xx, xxx
  • xx -xx, xxx-xxx

Я хочу сделать все это без написания каких-либо функций, но я не знаю, возможно ли это. У меня проблемы с "обнаружением" всех различных форматов, хотя:

Вот что у меня есть:

SELECT  ProductNumber,
        CASE WHEN CHARINDEX(',', PageNumber) > 0
             THEN SUBSTRING(PageNumber, 0, CHARINDEX('-', PageNumber))
             WHEN CHARINDEX('-', PageNumber) > 0
             THEN SUBSTRING(PageNumber, 0, CHARINDEX('-', PageNumber))
             ELSE PageNumber
        END AS PageNumber
FROM    table
WHERE   PageNumber IS NOT NULL
    AND PageNumber <> '' 

Может кто-нибудь предложить мне помощь? Спасибо!

Ответы [ 2 ]

3 голосов
/ 02 сентября 2010

Использовать сопоставление с образцом, а не CHARINDEX

CASE также вынуждает упорядочивать оценку, что помогает в 3-м случае, который совпадает с первыми 2 случаями.

Не проверено, что-то вроде

CASE
    WHEN PageNumber LIKE '[0-9][0-9][0-9]%' THEN LEFT(PageNumber, 3)
    WHEN PageNumber LIKE '[0-9][0-9]-[0-9][0-9], [0-9][0-9][0-9]') THEN RIGHT(PageNumber , 3)
    WHEN PageNumber LIKE '[0-9][0-9]%') THEN LEFT(PageNumber, 2)
END
2 голосов
/ 02 сентября 2010

попробуйте это:

DECLARE @YourTable table (ProductNumber int, PageNumber varchar(20))
INSERT @YourTable VALUES (1,'123, 456')
INSERT @YourTable VALUES (2,'123')
INSERT @YourTable VALUES (3,'123-456')
INSERT @YourTable VALUES (4,'12, 345-678')
INSERT @YourTable VALUES (5,'12-34, 567')
INSERT @YourTable VALUES (6,'12-34, 567-789')

;WITH AllNumbers AS   ---builds a Numbers table 1-100
(   SELECT 1 AS Number
    UNION ALL
    SELECT Number+1
        FROM AllNumbers
        WHERE Number<101
)
, RowChars AS --one row for each non-numeric single character value per @YourTable row
(   SELECT DISTINCT
        ProductNumber,Number, SUBSTRING(PageNumber,Number,1) AS CharacterOF
        FROM @YourTable
            INNER JOIN AllNumbers  ON 1=1
        WHERE SUBSTRING(PageNumber,Number,1) IS NOT NULL AND SUBSTRING(PageNumber,Number,1) NOT LIKE '[0-9]' AND SUBSTRING(PageNumber,Number,1)!=''
)
,FirstSplit AS --get first non-numeric single character value per @YourTable row
(   SELECT
        ProductNumber,MIN(Number) AS SplitOf
        FROM RowChars
        GROUP BY ProductNumber
)
SELECT
    t.ProductNumber, LEFT(t.PageNumber,COALESCE(s.SplitOf-1,LEN(t.PageNumber))) AS NewPage,t.PageNumber AS OldPage
    FROM @YourTable                 t
        LEFT OUTER JOIN FirstSplit  s ON t.ProductNumber=s.ProductNumber

ВЫВОД:

ProductNumber NewPage              OldPage
------------- -------------------- --------------------
1             123                  123, 456
2             123                  123
3             123                  123-456
4             12                   12, 345-678
5             12                   12-34, 567
6             12                   12-34, 567-789

(6 row(s) affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...