Несколько мыслей о создании и использовании таблиц для испытаний:
1. Ввод SQL может быть выполнен через уже существующую таблицу
Code Golf Методы ввода / вывода :
SQL могут принимать входные данные из именованной таблицы
Создание и заполнение этой таблицы входными значениями не учитывается в сумме байтов, вы можете просто предположить, что она уже есть.
Это означает, что ваши вычисления могут выводиться с помощью простого SELECT из входной таблицы:
SELECT 2*SQRT(a)FROM t
2. Если возможно, вообще не создавайте таблицу
Вместо (69 байт):
CREATE TABLE t(b INT)
INSERT t VALUES(7),(14),(21),(99)
SELECT b FROM t
Просто сделайте (43 байта):
SELECT b FROM(VALUES(7),(14),(21),(99))t(b)
3. Если возможно, создайте таблицу с помощью SELECT INTO
Вместо (39 байт):
CREATE TABLE t(p INT)
INSERT t VALUES(2)
Сделайте это (17 байт):
SELECT 2 p INTO t
4: Рассмотрите возможность объединения нескольких столбцов
Вот два варианта, которые возвращают один и тот же результат:
SELECT a,b FROM
(VALUES('W','Bob'),('X','Sam'),('Y','Darla'),('Z','Elizabeth'))t(a,b)
SELECT LEFT(a,1),SUBSTRING(a,2,99)FROM
(VALUES('WBob'),('XSam'),('YDarla'),('ZElizabeth'))t(a)
После некоторого тестирования верхняя версия (несколько столбцов) кажется короче с 7 или менее строками , нижняя версия (из-за LEFT и SUBSTRING) короче с 8 или более строками . Ваш пробег может варьироваться в зависимости от ваших точных данных.
5: используйте REPLACE и EXEC для очень длинных последовательностей текста
В отличном ответе comforblydrei , если у вас есть 15 или более значений , используйте REPLACE
символ, чтобы избавиться от повторяющихся'),('
разделителей между элементами:
114 символов:
SELECT a FROM(VALUES('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H')
,('I'),('J'),('K'),('L'),('M'),('N'),('O'))t(a)
112 символов:
DECLARE @ CHAR(999)=REPLACE('SELECT a FROM(VALUES(''
A-B-C-D-E-F-G-H-I-J-K-L-M-N-O''))t(a)','-','''),(''')EXEC(@)
Если вы уже используете динамический SQL по другим причинам (или имеете несколько замен), то порог, в котором это стоит, гораздо ниже.
6: используйте SELECT с именованными столбцами вместо набора переменных
Вдохновленный отличным ответом jmlt здесь , повторно используйте строки через SELECT:
SELECT a+b+a+b+d+b+b+a+a+d+a+c+a+c+d+c+c+a+a
FROM(SELECT'Hare 'a,'Krishna 'b,'Rama 'c,'
'd)t
возвращается
Hare Krishna Hare Krishna
Krishna Krishna Hare Hare
Hare Rama Hare Rama
Rama Rama Hare Hare
(Для MS SQL я изменил \t
к возвращению в линии, и переменил CONCAT()
на , +
чтобы сохранить байты).