QGIS має може виконувати синтаксичний аналіз SQL-подібних виразів. Підтримується лише обмежена підмножина мови SQL. Вирази можуть розглядатися як логічні предикати (обчислюються як True чи False) або як функції (обчислюються як скалярна величина).
Реалізовано підтримку трьох основних типів даних:
число — цілі та десяткові числа, наприклад 123, 3.14
рядок — повинні включатися в одинарні лапки: 'hello world'
посилання на стовпчик — під час обчислення посилання замінюється на значення вказаного поля. Імена полів не екрануються.
Доступні такі операції:
арифметичні оператори: +, -, *, /, ^
дужки: для зміни пріоритету операцій: (1 + 1) * 3
унарні плюс та мінус: -12, +5
математичні функції: sqrt, sin, cos, tan, asin, acos, atan
геометричні функції: $area, $length
функції перетворення типів даних: to int, to real, to string
Крім того, підтримуються наступні предикати:
порівняння: =, !=, >, >=, <, <=
відповідність зразку: LIKE (з використанням % та _), ~ (регулярні вирази)
логічні предикати: AND, OR, NOT
перевірка на NULL: IS NULL, IS NOT NULL
Приклади предикатів:
Приклади скалярних виразів:
>>> exp = QgsExpression('1 + 1 = 2')
>>> exp.hasParserError()
False
>>> exp = QgsExpression('1 + 1 = ')
>>> exp.hasParserError()
True
>>> exp.parserErrorString()
PyQt4.QtCore.QString(u'syntax error, unexpected $end')
>>> exp = QgsExpression('1 + 1 = 2')
>>> value = exp.evaluate()
>>> value
1
У наступних прикладах вираз обчислюється для поточного об’єкта. «Column» це назва поля атрибутивної таблиці шару.
>>> exp = QgsExpression('Column = 99')
>>> value = exp.evaluate(feature, layer.pendingFields())
>>> bool(value)
True
Якщо необхідно перевірити декілька об’єктів використовуйте QgsExpression.prepare().Використання :func:`QgsExpression.prepare()`підвищить швидкість аналізу та обчислення виразу.
>>> exp = QgsExpression('Column = 99')
>>> exp.prepare(layer.pendingFields())
>>> value = exp.evaluate(feature)
>>> bool(value)
True
exp = QgsExpression("1 + 1 = 2 ")
if exp.hasParserError():
raise Expection(exp.parserErrorString())
value = exp.evaluate()
if exp.hasEvalError():
raise ValueError(exp.evalErrorString())
print value
Наступний приклад можна використовувати для фільтрації шару та отриманні об’єктів, які задовольняють умові.
def where(layer, exp):
print "Where"
exp = QgsExpression(exp)
if exp.hasParserError():
raise Expection(exp.parserErrorString())
exp.prepare(layer.pendingFields())
for feature in layer.getFeatures():
value = exp.evaluate(feature)
if exp.hasEvalError():
raise ValueError(exp.evalErrorString())
if bool(value):
yield feature
layer = qgis.utils.iface.activeLayer()
for f in where(layer, 'Test > 1.0'):
print f + " Matches expression"