В нашей таблице товаров ширина и высота указаны непосредственно в описании товара.
Я пытаюсь разбить ширину и высоту на отдельные числовые столбцы, чтобы нам не приходилось возиться с длинными строками каждый раз, когда нам нужны данные о размере.
Однако проблема, с которой я столкнулся, заключается в том, что эти описания не стандартизированы. Большинство размеров правильно сохраняются как Ш" X В", но некоторые также могут быть Ш"ХВ", -Ш"хВ"-, а некоторые могут даже иметь третью двойную кавычку для закругления углов, длины и т. д.
Можно ли создать универсальную функцию, которая может извлекать ширину и высоту из всех типов форматов описания? Должен ли я разбить их на отдельные функции для каждого формата?
Константы:
Переменные:
Образец данных:
Что я пробовал:
SELECT
UPPER(REPLACE(
REPLACE(
RIGHT(
LEFT(Description,CHARINDEX('"',Description,CHARINDEX('"',Description)+1)-1),
LEN(
LEFT(Description,CHARINDEX('"',Description,CHARINDEX('"',Description)+1)-1)
)
- CHARINDEX('"',
LEFT(Description,CHARINDEX('"',Description,CHARINDEX('"',Description)+1)-1)
) + 3)
, '"', '')
, ' ','')) AS Result, Description
FROM HQMT
WHERE UPPER(Description) LIKE '%"%X%"%'
Результат:
Получив эти результаты, я планирую вытащить все символы слева от «X» для ширины и все символы справа от «X» для высоты. В основном это правильно, но ширина трех цифр обрезается. Есть идеи, как исправить/сделать динамичнее?
Как вы хотите обрабатывать описания, содержащие одинарные или двойные кавычки и не связанные с измерениями? Например, знак «Большая Берта» 96 дюймов x 120 дюймов или строки с буквой X, например, знак Xavier 3 модели 2000 года.
Это сложная задача даже для языков с надежными инструментами синтаксического анализа. См. stackoverflow.com/questions/57296129/…
@BartMcEndree К счастью, их не существует, кавычки используются только для размеров в этой таблице. Строки с X и без кавычек уже отфильтровываются с помощью WHERE UPPER(Description) LIKE '%"%X%"%'
.
Даже если я смогу обновить 80% из них с помощью этой функции, остальные я смогу ввести вручную. Это будет только одноразовое обновление и не будет проблемой в будущем.
Возможно, возьмите 4 символа слева и справа от X и удалите все нечисловые символы. stackoverflow.com/questions/18625548/…
мои мысли обращаются к РЕГУЛЯРНЫМ ВЫРАЖЕНИЯМ....
Это просто вставит достаточно пробелов вокруг символов X
и -
, чтобы вы могли безопасно получить последние три символа, предшествующие каждой кавычке:
select * from T cross apply (
select
min(case when ordinal = 1 then cast(ltrim(right(value, 3)) as int) end),
min(case when ordinal = 2 then cast(ltrim(right(value, 3)) as int) end)
from string_split(
replace(replace(replace(Description, '-', ' '), 'X', ' '), ' ', ' '),
'"', 1) as s
) as dimensions(width, height)
Это предполагает, что ширина и высота всегда отображаются рядом с первыми двумя кавычками без пробела и что вы используете более новую версию SQL Server с выводом ordinal
из string_split()
. Этот случай можно было бы обработать, но поскольку он существует, это приведет к ошибке.
--Grab 4 chrs preceeding " and Adding another replace to remove dash
SELECT
UPPER(
REPLACE(
REPLACE(
REPLACE(
RIGHT(
LEFT(Description,CHARINDEX('"',Description,CHARINDEX('"',Description)+1)-1),
LEN(
LEFT(Description,CHARINDEX('"',Description,CHARINDEX('"',Description)+1)-1)
)
- CHARINDEX('"',
LEFT(Description,CHARINDEX('"',Description,CHARINDEX('"',Description)+1)-1)
) + 4)
, '"', '')
, ' ','')
,'-','')
) AS Result, Description
FROM HQMT
WHERE UPPER(Description) LIKE '%"%X%"%'
Используйте ПЕРЕВОД, чтобы удалить все символы, кроме цифр и X (применяется к 4 символам перед ").
SELECT
UPPER(
REPLACE(TRANSLATE(
RIGHT(
LEFT(Description,CHARINDEX('"',Description,CHARINDEX('"',Description)+1)-1),
LEN(
LEFT(Description,CHARINDEX('"',Description,CHARINDEX('"',Description)+1)-1)
)
- CHARINDEX('"',
LEFT(Description,CHARINDEX('"',Description,CHARINDEX('"',Description)+1)-1)
) + 4)
, 'abcdefghijklmnopqrstuvwyz+()- ,#+"', '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'), '@', '')
)
AS Result, Description
FROM HQMT
WHERE UPPER(Description) LIKE '%"%X%"%'
Это близко, спасибо! Однако мне пришлось изменить все символы перевода на прописные и изменить каждую ссылку на описание на UPPER (Описание). Без этого он просто заменял строчные буквы. Он также не работает, если четвертый предшествующий символ является числом (HIP .125 6 x 12 дюймов получается как 56X12). Я просто вручную исключил эти записи.
Обязательно поместите это в пользовательскую функцию, чтобы каждый мог ее использовать :-)
Честно говоря, это вряд ли будет задачей для SQL Server, и лучшим выбором будет язык с мощными инструментами манипулирования строками. Конечно, настоящее решение — исправить данные; это требует некоторой значительной нормализации.