QGIS has some support for parsing of SQL-like expressions. Only a small subset of SQL syntax is supported. The expressions can be evaluated either as boolean predicates (returning True or False) or as functions (returning a scalar value).
Three basic types are supported:
The following operations are available:
And following predicates are supported:
Compatibility note: mathematical, geometry, conversion functions and power operator ^ are available from QGIS 1.4.
Examples of predicates:
Examples of scalar expressions:
>>> 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.toInt()
(1, True)
The following example will evaluate the given expression against a feature. “Column” is a name of the field in the layer.
>>> exp = QgsExpression('Column = 99')
>>> value = exp.evaluate(feature, layer.pendingFields())
>>> value.toBool()
True
You can also use QgsExpression.prepare() if you need check more then one feature. Using QgsExpression.prepare() will increase the speed that evaluate takes to run.
>>> exp = QgsExpression('Column = 99')
>>> exp.prepare(layer.pendingFields())
>>> value = exp.evaluate(feature)
>>> value.toBool()
True
exp = QgsExpression("1 + 1 = 2 ")
if exp.hasParserError():
raise Expection(exp.parserErrorString())
value = exp.evaluate()
if exp.hasEvalError():
raise ValueError(exp.evalErrorString())
value.toInt()
The following example can be used to filter a layer and return any feature that matches a predicate.
def where(layer, exp):
print "Where"
exp = QgsExpression(exp)
if exp.hasParserError():
raise Expection(exp.parserErrorString())
exp.prepare(layer.pendingFields())
feature = QgsFeature()
layer.select(layer.pendingAllAttributesList())
while layer.nextFeature(feature):
value = exp.evaluate(feature)
if exp.hasEvalError():
raise ValueError(exp.evalErrorString())
if value.toBool():
yield feature
layer = qgis.utils.iface.activeLayer()
for f in where(layer, 'Test > 1.0'):
print f + " Matches expression"