Кілька думок про створення та використання таблиць для викликів:
1. Введення SQL можна здійснити через попередньо існуючу таблицю
Коди Гольф Методи введення / виведення :
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 або меншими рядками , нижня (завдяки лівому та підписному) коротша на 8 чи більше рядків . Ваш пробіг може змінюватися в залежності від ваших точних даних.
5: Використовуйте REPLACE і EXEC для дуже довгих послідовностей тексту
У відмінні відмінної відповіді комфортнодреї , якщо у вас є 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()
на , +
щоб зберегти байти).