Выберите макс. интервал из varchar столбца

(для дальнейшего использования этот тип «передового опыта» лучше подходит для Firebase Google Group , чем для переполнения стека)

Во-первых, я не уверен, что это был преднамеренное или ошибка в вашей диаграмме, но я просто хочу отметить, что в структуре # 1 вы должны иметь поля username, age и gender в качестве полей в пользовательском документе, а не в качестве подколлекции в качестве диаграммы предлагает. (Я предполагаю, что это то, что вы имели в виду, учитывая ваше описание, но просто чтобы быть уверенным, поскольку пользовательские данные будут плохо использовать подколлекции).

Теперь перейдем к вашему основному вопросу:

Firestore значительно выигрывает при работе с плоской структурой данных , то есть с большим количеством небольших документов, в отличие от небольшого количества. больших документов. Это один из моментов, на которые ссылаются люди, когда говорят об анти-вложенных методах.

То, как вы структурируете свои данные, зависит именно от того , как вы планируете взаимодействовать с ними , а не только от того, на что имеет смысл смотреть.

Structure #1 не будет работать так же хорошо, как Structure #2, если вы когда-либо планируете, чтобы пользователь мог видеть повестки дня других пользователей. Это все еще будет работать, но запрос будет намного ужаснее.

При этом, если повестки дня видны только их владельцам, тогда Structure #1 может иметь больше смысла, просто учитывая тот факт, что организация более интуитивно понятна для этой цели. Вы также можете получить немного более быстрое время ответа на запрос, используя Structure #1.

Нет ничего плохого в Structure #2. Если либо сейчас, либо в будущем пользователи могут просматривать повестки дня других пользователей, то Structure #2 - ваш лучший выбор. Structure #2 также будет лучше, если вы планируете искать программы по нескольким пользователям по одному из его полей. Например, если вы когда-либо хотели просмотреть 20 самых последних документов повестки дня для всего приложения по их полю timestamp.

У моего проекта очень похожая ситуация в другом контексте. Наше приложение имеет Posts и Content. Каждый Post содержит один или несколько Content. Мы могли бы сделать Content вложенной коллекцией для каждого Post (как ваш Structure #1), но вместо этого мы сделали Content коллекцию корневого уровня (как ваш Structure #2), потому что нам нужно было запрашивать Content документы между пользователями на основе одного из их полей.

В заключение, Structure #2 является более гибким, но если вы уверены, что не хотите запрашивать повестки дня у нескольких пользователей ( запрос группы сбора ), тогда Structure #1 может быть более выгодным .

Обычно я по умолчанию использую Structure #2, за исключением тех редких, но законных обстоятельств, когда действительно имеет смысл выделять данные для конкретных документов.

13
задан Joel Coehoorn 4 February 2009 в 18:55
поделиться

6 ответов

Вам нужна комбинация из-за того, что isnumeric возвращается 1 для следующих вещей

select isnumeric('+'),isnumeric('5d2') 

Ваш, где пункт был бы похож на это

WHERE VALUE NOT LIKE '%[a-z]%'
        AND ISNUMERIC(VALUE) = 1

create table #bla (value varchar(50))
insert #bla values('123')
insert #bla values('a5')
insert #bla values('789')
insert #bla values('b1')

SELECT MAX(CAST(value AS Int)) FROM #bla
WHERE VALUE NOT LIKE '%[a-z]%'
    AND ISNUMERIC(VALUE) = 1

Я записал об этом здесь Проблему ISNUMERIC

26
ответ дан 1 December 2019 в 17:55
поделиться

Изучите кастинг столбца к интервалу, затем выбрав МАКСА (). Я не знаю то, что это сделает к столбцам, которые содержат буквы, но это стоит исследовать.

http://doc.ddart.net/mssql/sql70/ca-co_1.htm

1
ответ дан 1 December 2019 в 17:55
поделиться

Вы могли бы попробовать

Select MAX(BoxNumber) from {table} where IsNumeric(BoxNumber) = 1
8
ответ дан 1 December 2019 в 17:55
поделиться

Необходимо проверить это решение для значений как '+' и '-', поскольку я думаю, что функция IsNumeric может возвратиться 1 для этих значений

2
ответ дан 1 December 2019 в 17:55
поделиться

Выбранный ответ работал у меня, пока я не добавил это значение в таблица temp вместе с другими в примере:

insert #bla values('1234')

Я ожидал, что мой результат max () теперь будет 1234, но он остался на уровне 789. Возможно, это связано с некоторыми настройками сопоставления, но я смог воспроизвести в нескольких базах данных. Я обнаружил, что этот запрос ниже работает для меня, но мне, безусловно, было бы интересно узнать, есть ли более эффективный способ сделать это. Кроме того, я не хотел включать какие-либо десятичные значения, поэтому я исключил все, что имеет точку.

SELECT MAX(CAST(Value AS Int)) FROM #bla 
WHERE ISNUMERIC(Value)=1 
    AND Value NOT LIKE '%[a-z]%' 
    AND Value NOT LIKE '%.%'
3
ответ дан 1 December 2019 в 17:55
поделиться

Почему бы и нет

SELECT MAX(CAST(Value AS Int)) FROM #bla 
WHERE ISNUMERIC(Value)=1 
    AND Value LIKE '%[0-9]%' 

тогда вы Имеем дело только с числовыми строками. В этом случае вам может не понадобиться ISNUMERIC ()

4
ответ дан 1 December 2019 в 17:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: