Как по сравнению с “=” для соответствующих строк с помощью SQL Server

Решением в чистом Python было бы использование defaultdict с составным ключом. Вы можете использовать это, чтобы объединить ваши ценности. После этого вы можете снова создать список из этого словаря.

from collections import defaultdict

dct = defaultdict([])

for entry in lst:
    dct[(entry['number'], entry['favorite'])].append(entry['color'])

lst = [{'number': key[0], 'favorite': key[1], color: value if len(value) > 1 else value[0]}
    for key, value in dct.items()]
8
задан Peter Mortensen 6 February 2018 в 19:21
поделиться

8 ответов

Вы корректны. Нет никакого преимущества в использовании КАК ТО, если Вы не делаете подстановочное соответствие. Кроме того, использование его без подстановочного знака могло привести к использованию неэффективного queryplan.

13
ответ дан 5 December 2019 в 05:57
поделиться

Если никакие подстановочные знаки не используются, то различие, это "=" делает точное совпадение, но КАК будет соответствовать строке конечным пробелам (от SSBO):

При выполнении сравнений строк с ПОДОБНЫМ все символы в строке образца являются значительными, включая продвижение или конечные пробелы. Если сравнение в запросе должно возвратить все строки со строкой КАК 'abc' (abc, сопровождаемая одиночным пробелом), строка, в которой значение того столбца является abc (abc без пространства) не возвращается. Однако конечные пробелы, в выражении, к которому подобран шаблон, проигнорированы. Если сравнение в запросе должно возвратить все строки со строкой КАК 'abc' (abc без пространства), все строки, которые запускаются с abc и имеют нуль, или возвращается больше конечных пробелов.

3
ответ дан 5 December 2019 в 05:57
поделиться

Солнечный почти разобрался в нем :)

Выполните следующее в QA в установке по умолчанию SQL2005

select * from sysobjects where name = 'sysbinobjs   '
-- returns 1 row
select * from sysobjects where name like 'sysbinobjs   '
-- returns 0 rows

Так, КАК не соответствует на конечных пробелах, на стороне плана запросов оба работают почти одинаково, но '=', соединение выполняет крошечный бит лучше.

Дополнительная вещь, которую НЕОБХОДИМО иметь в виду при использовании КАК, состоит в том, чтобы выйти строки правильно.

declare @s varchar(40) 
set @s = 'escaped[_]_%'

select 1 where 'escaped[_]_%'  like @s 
--Return nothing = BAD 

set @s = '_e_s_c_a_p_e_d_[___]___%' 

select 1 where 'escaped[_]_%'  like @s escape '_'
--Returns 1 = GOOD

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

Но... если Вы хотите реальное точное совпадение, которое эффективно, КАК может решить проблему.

Скажите, Вы хотите соответствовать имени пользователя к "sam" и не хотите получать "Sam" или "Sam", и к сожалению сопоставление столбца нечувствительно к регистру.

Что-то как следующее (с добавленным выходом) является способом пойти.

select * from sysobjects
WHERE name = 'sysbinobjs' and name COLLATE Latin1_General_BIN LIKE 'sysbinobjs'

Причина Вы делаете двойное соответствие, состоит в том, чтобы избежать сканирования таблицы.

Однако....

Я думаю, что varbinary, бросающий прием, менее подвержен ошибкам и легче помнить.

7
ответ дан 5 December 2019 в 05:57
поделиться

С ПОДОБНЫМ ключевым словом можно соответствовать полю u.username против указанного шаблона вместо фиксированной "строки".

2
ответ дан 5 December 2019 в 05:57
поделиться

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

2
ответ дан 5 December 2019 в 05:57
поделиться

Да - Вы правы - это должно только использоваться для подстановочного соответствия. Это должно использоваться экономно особенно на очень больших таблицах на неиндексируемых полях, поскольку это может замедлить Ваши запросы ПУТЕМ ПУТЬ.

1
ответ дан 5 December 2019 в 05:57
поделиться

КАК для подстановочного соответствия, где как = (равняется), для точные совпадения.

Я также думаю, что это использовало для полей, которые были каталогизированы ПОЛНОТЕКСТОВЫМИ КАТАЛОГАМИ для сравнений строк ядра.

0
ответ дан 5 December 2019 в 05:57
поделиться

Да, насколько я знаю, использование как без любых подстановочных знаков совпадает с использованием = оператор. действительно ли Вы уверены, что входной параметр не имеет подстановочных знаков в нем?

-1
ответ дан 5 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

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