T-SQL - GROUP BY с ПОДОБНЫМ - действительно ли это возможно?

Я нахожусь в процессе записи некоторого кода в проект с открытым исходным кодом, названный thrift-protobuf-compare, выдерживающим сравнение между protobuf и экономией. На данный момент это покрывает немного аспектов сериализации, но я намереваюсь покрыть больше. Результаты (для Экономия и Protobuf) обсуждены в моем блоге, я добавлю больше, когда я доберусь до него. Можно посмотреть на код для сравнения API, языка описания и сгенерированного кода. Я буду рад иметь вклады для достижения более округленного сравнения.

11
задан default locale 25 June 2013 в 09:33
поделиться

7 ответов

Вам нужно выражение, которое возвращает «Fall_2009» или «Spring_2009», а затем сгруппируйте его по этому выражению. например:

-- identify each pattern individually w/ a case statement
SELECT
  CASE
    WHEN column_x LIKE '%Fall[_]2009'   THEN 'Fall 2009'
    WHEN column_x LIKE '%Spring[_]2009' THEN 'Spring 2009'
  END AS group_by_value
, COUNT(*) AS group_by_count
FROM Table1 a
GROUP BY 
  CASE
    WHEN column_x LIKE '%Fall[_]2009'   THEN 'Fall 2009'
    WHEN column_x LIKE '%Spring[_]2009' THEN 'Spring 2009'
  END

или

-- strip all characters up to the first space or dash
SELECT 
  STUFF(column_x,1,PATINDEX('%[- ]%',column_x),'') AS group_by_value
, COUNT(*) as group_by_count
FROM Table1 a
GROUP BY 
  STUFF(column_x,1,PATINDEX('%[- ]%',column_x),'')

или

-- join to a (pseudo) table of pattern masks
SELECT b.Label, COUNT(*)
FROM Table1 a
JOIN (
  SELECT '%Fall[_]2009'  , 'Fall, 2009' UNION ALL
  SELECT '%Spring[_]2009', 'Spring, 2009'
  ) b (Mask, Label) ON a.column_x LIKE b.Mask
GROUP BY b.Label
22
ответ дан 3 December 2019 в 03:04
поделиться

Нет, функция LIKE не поддерживается в предложении GROUP BY . Вам нужно будет использовать:

  SELECT x.term,
         COUNT(*)
    FROM (SELECT CASE
                   WHEN CHARINDEX('Fall_2009', t.column) > 0 THEN
                     SUBSTRING(t.column, CHARINDEX('Fall_2009', t.column), LEN(t.column))
                   WHEN CHARINDEX('Spring_2009', t.column) > 0 THEN
                     SUBSTRING(t.column, CHARINDEX('Spring_2009', t.column), LEN(t.column))
                   ELSE
                     NULL
                 END as TERM
            FROM TABLE t) x
GROUP BY x.term
3
ответ дан 3 December 2019 в 03:04
поделиться

LIKE не имеет смысла в вашем контексте, поскольку он либо совпадает, либо нет, но он не создает группы. Вам придется использовать строковые функции, которые анализируют значения столбцов в соответствии с вашими данными.

2
ответ дан 3 December 2019 в 03:04
поделиться

Я так не думаю, ПОДОБНО - это фактически двоичное состояние - что-то похоже или НЕ похоже, нет логических степеней «подобия», которые можно было бы сгруппировать вместе. С другой стороны, я мог бы быть не в своей тарелке.

Если вы действительно хотите выразить фильтрацию ваших сгруппированных данных, взгляните на предложение HAVING.

http://msdn.microsoft.com/en-us /library/ms180199.aspx

1
ответ дан 3 December 2019 в 03:04
поделиться

Вы можете сделать это таким образом, но, как говорили другие, на самом деле это не имеет смысла:

SELECT COUNT(*) 
    FROM tblWhatever
GROUP BY column_x 
HAVING column_x LIKE '%Fall-2009%'
0
ответ дан 3 December 2019 в 03:04
поделиться

К сожалению, у вас плохо структурированная база данных, в которой SUBJECT и TERM объединены в один столбец. Когда вы используете GROUP BY, он обрабатывает каждое уникальное значение в столбце как группу в наборе результатов. Лучше всего порекомендовать вам реструктурировать базу данных, если это вообще возможно - вы, вероятно, захотите здесь три столбца (SUBJECT, TERM, SCHOOL_YEAR), но два, возможно, подойдут.

Если вы не можете реструктурировать базу данных, вам понадобятся для анализа столбца и извлечения термина. Rexem показал вам один способ сделать это, вы также можете использовать хранимую процедуру.

0
ответ дан 3 December 2019 в 03:04
поделиться

Создание уникальной соли для каждого пароля - это нормально. Соль может быть продуктом существующего материала (например, UserID и др.) Или генерироваться случайным образом. Преимущество состоит в том, что атака на зашифрованную информацию становится все непрактичной по мере того, как растет сила соли.

Помните: любой криптографический алгоритм взломан. Информация может считаться «безопасной» только в том случае, если взлом защиты (с помощью радужной таблицы или иным образом) дороже, чем ее ценность.

редактировать:

Предполагая, что вы новичок в криптографии, вот еще несколько советы:

  • Более длинные соли лучше, чем короткие.
  • Чем больше возможных значений для соли, тем лучше. Буквенно-цифровая соль лучше, чем числовая. Бинарная соль лучше буквенно-цифровой.
1
ответ дан 3 December 2019 в 03:04
поделиться